Sunday, March 18, 2012

magento 图片防盗链,Apache服务器使用.htaccess实现图片防盗链


所谓盗链,是指其他网站直接链接我们网站上的文件,一般来说,盗链的对象大多为很耗带宽的大体积文件,如图片、视频等。这样造成的后果主要有:增加了服务器的流量负担,影响我们网站的访问速度。
如果你用的是Apache服务器,那么使用.htaccess文件就可以很方便的进行设置,从而防止其他站点的用户盗链我们站点的文件。

Apache中的.htaccess文件

.htaccess文件是Apache中相当重要的配置文件,其格式为纯文本,它提供了针对目录改变配置的方法,通过在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作用于此目录及其所有子目录。
通过.htaccess文件,可以实现简单地很多在IIS中很繁琐甚至无法实现的功能,如密码保护、禁止显示目录列表、阻止/允许特定的IP地址、实现网址的301 重定向等等。
正 如上面所说,.htaccess文件将影响其所在的目录及其子目录,因此,如果我们要保护的内容(此处以防止图片盗链为例,即图片)位于网站内多个目录 下,可以考虑将其放在根目录下;而如果图片有单独的子目录如“/images/”,则只需将其放置在该目录下(当然也可以放到根目录中)。
需 要注意的是,如果通过FTP方式将创建好的.htaccess上传到服务器上,传输模式应为ASCII而非Binary。上传到服务器后,应将其属性通过 CHMOD修改为644 或“RW-R–R–”,这样,可以保证服务器能够使用同时无法通过浏览器修改,当然,.htaccess的可读属性也存在一定的风险:攻击者可通过它找出 您要保护的对象或认证文件位置——解决办法是将认证文件.htpasswd放到网站根目录之外,这样,便无法通过网络找到它了。

使用.htaccess禁止盗链

通过.htaccess来防止网站的图片、压缩文件、或视频等非Html文件被盗链的方法相当简单,通过在该文件中加入几句命令即可保护我们宝贵的带宽。例如本站的设置如下:
  1. RewriteEngine on
  2. RewriteCond %{HTTP_REFERER} !^[NC]
  3. RewriteCond %{HTTP_REFERER} !webeta.cn [NC]
  4. RewriteCond %{HTTP_REFERER} !ikuaizi.com [NC]
  5. RewriteCond %{HTTP_REFERER} !zhuaxia.com [NC]
  6. RewriteCond %{HTTP_REFERER} !xianguo.com [NC]
  7. RewriteCond %{HTTP_REFERER} !google.com [NC]
  8. RewriteCond %{HTTP_REFERER} !bloglines.com [NC]
  9. RewriteCond %{HTTP_REFERER} !feedburner.com [NC]
  10. RewriteCond %{HTTP_REFERER} !feedsky.com [NC]
  11. RewriteRule .*.(gif|jpg)http://domain.com/no.png [R,NC,L]
简单的解释一下上述语句:
1、RewriteCond %{HTTP_REFERER} !^$ [NC]
允许空“HTTP_REFERER”的访问,即允许用户在浏览器地址栏中直接输入图片地址时图片文件的显示。一般而言,这是可选的,不过,建议这么设置,如果强迫必须具有“HTTP_REFERER”才能访问,可能会带来某些问题,比如说在用户通过代理服务器访问时。
2、RewriteCond %{HTTP_REFERER} !domain.com [NC]
设置允许访问的HTTP来源,包括我们的站点自身、Google、Baidu、Bloglines、Feedburner等。
3、RewriteRule .*.(gif|jpg|png)$ http://domain.com/no.png [R,NC,L]
定义被盗链时替代的图片,让所有盗链 jpg、gif、png 等文件的网页,显示根目录下的 no.png 文件。注意:替换显示的图片不要放在设置防盗链的目录中,并且该图片文件体积越小越好。当然你也可以不设置替换图片,而是使用下面的语句即可:
RewriteRule .*.(gif|jpg|png)$ – [F]
4、说明一下其中的R、NC 和 L
R 就是转向的意思
NC 指的是不区分大小写
L 的作用是指明本次转向到此结束,后续的转向不受先前判断语句的影响
5、防止盗链的文件类型
上例中是 gif、jpg、png,而根据需要,可更改或添加其他文件类型,如rar、mov等,不同文件扩展名间使用“|”分割。
这样的话,就可以基本做到简单的防止被盗链情况的发生,而且可以尽最大可能的减少服务器流量的无畏消耗,当然了,如果你不在意这点流量的话,那么可以不用考虑上述设置啦!

Magento SEO 总结 — Magento Robots.txt



下面是典型的一个magento站点的robots.txt具体设置, 有需要的同学可以根据实际情况做适当的调整…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# Website Sitemap
Sitemap: http://www.mydomain.com/sitemap.xml
 
# Crawlers Setup
User-agent: *
Crawl-delay: 10
 
# Allowable Index
Allow: /*?p=
Allow: /index.php/blog/
Allow: /catalog/seo_sitemap/category/
Allow:/catalogsearch/result/
 
# Directories
Disallow: /404/
Disallow: /app/
Disallow: /cgi-bin/
Disallow: /downloader/
Disallow: /includes/
Disallow: /js/
Disallow: /lib/
Disallow: /magento/
Disallow: /media/
Disallow: /pkginfo/
Disallow: /report/
Disallow: /skin/
Disallow: /stats/
Disallow: /var/
 
# Paths (clean URLs)
Disallow: /index.php/
Disallow: /catalog/product_compare/
Disallow: /catalog/category/view/
Disallow: /catalog/product/view/
Disallow: /catalogsearch/
Disallow: /checkout/
Disallow: /control/
Disallow: /contacts/
Disallow: /customer/
Disallow: /customize/
Disallow: /newsletter/
Disallow: /poll/
Disallow: /review/
Disallow: /sendfriend/
Disallow: /tag/
Disallow: /wishlist/
 
# Files
Disallow: /cron.php
Disallow: /cron.sh
Disallow: /error_log
Disallow: /install.php
Disallow: /LICENSE.html
Disallow: /LICENSE.txt
Disallow: /LICENSE_AFL.txt
Disallow: /STATUS.txt
 
# Paths (no clean URLs)
Disallow: /*.js$
Disallow: /*.css$
Disallow: /*.php$
Disallow: /*?p=*&
Disallow: /*?SID=


Magento修改订单编号


magento将各个站点的订单ID的前缀修改成不同的,而不是统一的都是从1000开头的那样。
修改Magento订单号的前缀
update eav_entity_store
inner join eav_entity_type on eav_entity_type . entity_type_id  =  eav_entity_store . entity_type_id
set eav_entity_store . increment_last_id = 30000000
where eav_entity_type . entity_type_code = ‘order’ ;
这样,下一个订单号就会变成300000001。

表的关系:直接修改increment_prefix:用phpadmin进入到表eav_entity_type中,查看
entity_type_code的值为order的记录对应的entity_type_id对应的ID值,然后进入eav_entity_store表 修改entity_type_id的值为上面找到的那个ID的记录对应的increment_prefix。如果有注意可能就会发现不同的store view已经是使用了不同的前缀了。

Show thumbnail image without pop-up window


Locate media.phtml inapp/design/frontend/default/themename/template/catalog/product/view, and near line# 59, you should see:
<a href=”#” onclick=”popWin(’<?php echo $this->getGalleryUrl($_image) ?>’, ‘gallery’, ‘width=300,height=300,left=50,top=50,location=no,status=yes,scrollbars=yes,resizable=yes’); return false;”><img src=”<?php echo $this->helper(’catalog/image’)->init($this->getProduct(), ‘thumbnail’, $_image->getFile())->resize(120); ?>” alt=”<?php echo $this->htmlEscape($_image->getLabel()) ?>” title=”<?php echo $this->htmlEscape($_image->getLabel()) ?>” /></a>
change the part in red to the following:
<a href=”<?php echo $this->helper(’catalog/image’)->init($this->getProduct(), ‘image’, $_image->getFile()); ?>” title=”<?php echo $_product->getName();?>” onclick=”$(’image’).src = this.href; return false;”>
You should be able to modify it a bit more if you want the image to update on mouseover.

Magento显示当前目录的父分类和子分类的分类名


Magento目录的分类页面里,希望在左侧导航获取到父分类子分类,可以用以下方法:
打开app/your_package/your_themes/template/catalog/navigation/left.phtml

显示父分类分类名

1
2
3
4
5
6
7
8
9
10
$currentCat = Mage::registry('current_category');
//如果是根目录,则显示当前目录
if ( $currentCat->getParentId() == Mage::app()->getStore()->getRootCategoryId() )
//显示当前目录名
echo $this->getCurrentCategory()->getName() ;
else
{
//显示当前目录的父分类名
echo $this->getCurrentCategory()->getParentCategory()->getName() ;
}

显示子分类分类名

显示的子分类是建立在当前的父分类的基础上
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$currentCat = Mage::registry('current_category');
 
if ( $currentCat->getParentId() == Mage::app()->getStore()->getRootCategoryId() )
{
    // 当前分类是顶级分类
    $loadCategory = $currentCat;
}
else
{
    // 当前分类是顶级分类的的一个子分类,载入当前分类的父分类
    $loadCategory = Mage::getModel('catalog/category')->load($currentCat->getParentId());
}
$subCategories = explode(',', $loadCategory->getChildren());
 
foreach ( $subCategories as $subCategoryId )
{
    $cat = Mage::getModel('catalog/category')->load($subCategoryId);
 
    if($cat->getIsActive())
    {
        echo '<a href="'.$cat->getURL().'">'.$cat->getName().'</a>';
    }
}

magento常用的语句


1.
得到产品,以及过滤:
getResourceModel('catalog/product_collection')
$collection = Mage::getModel('catalog/product')->getCollection();
->Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection
2.
    public function addAttributeToSelect($attribute, $joinType = false)
   

取得属性集,属性过滤
   $attributes = Mage::getSingleton('catalog/config')
    ->getProductAttributes();
   $collection->addAttributeToSelect($attributes) //选择属性
    ->addMinimalPrice()
    ->addFinalPrice()
    ->addTaxPercents()
    ->addAttributeToFilter('test_product', 1, 'left')  //属性过滤 具备该属性
    ->addStoreFilter();  //商店过滤

Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection); 
 //对产品的状态进行可见性过滤 Disable,EnableMage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection);  //visibility过滤 Catalog,Search,Not Visible$this->_productCollection = $collection;
3.
        protected function _prepareLayout()  //面包屑
        {
            if ($breadcrumbsBlock = $this->getLayout()->getBlock('breadcrumbs')) {
                $breadcrumbsBlock->addCrumb('home', array(
                    'label'=>Mage::helper('catalog')->__('Home'),
                    'title'=>Mage::helper('catalog')->__('Go to Home Page'),
                    'link'=>Mage::getBaseUrl()
                ));
            }   
                           
            parent::_prepareLayout();
        }
 
4.      
 
 protected function _beforeToHtml()
 {
  parent::_beforeToHtml();
  $toolbar = $this->getToolbarBlock();   //工具条
  $toolbar->removeOrderFromAvailableOrders('position'); //移除可用的排序
  return $this;
 }

5.
设定使用的模板
$this->setTemplate('catalog/product/edit.phtml'); 设置模板
6.
后台修改加入后台的块内容
$this->_addContent($this->getLayout()->createBlock('test/adminhtml_catalog_product_edit'));
实体的 不能是布尔的

给数据库中的某个表添加一个字段


1.
$installer = $this;
$installer->startSetup();
$installer->getConnection()->addColumn($this->getTable('cataloginventory_stock_item'), 'self', "VARCHAR( 255 ) NOT NULL COMMENT 'Netz98_Picklist'");
$installer->endSetup();

2. 
implode() 函数把数组元素组合为一个字符串

var_dump -- 打印变量的相关信息
var_dump ( mixed expression [, mixed expression [, ...]])

此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
可以比较一下 var_dump() 与print_r()函数。