当前位置:秋叶网络博客 常识大全 ◊ 301的规范写法,你写对了么?

301的规范写法,你写对了么?

作者:秋叶 发表时间:2015年3月03日

网址的规范和统一对一个网站具有至关重要的影响,除了用户体验外,还有一个重要成分--SEO。你是否还在百度一下,把网上别人写的301规则语法复制粘贴过来,改一下网址就得了?在这里我劝大家一句:网络的水很深,选择错了,怎么死的都不知道。

最近我查看了下蜘蛛的来访记录,发现它会频繁去爬取wuover.com/*这样的网址,而我的博客网址是www.wuover.com,爬就得了,关键它还带走数据,一般地如果做了301即使蜘蛛爬wuover.com/*,但是它马上就会被301带到www.wuover.com/*,这时才抓取数据。出现它抓取wuover.com/*的情况难道是我没做301吗?显然不是的,从我换域名开始我就做了301,把htacess下载下来看了下也没事。

后来去查找了下Apache的指令,才发现原来是301规则不规范造成的,当时我的301规则是这样的:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^wuover.com$
RewriteRule ^$ http://www.mizuiren.com/ [R=301,L]

大体上看上去也没问题的样子,实际上它是存在严重问题的,这样的写法只能保证博客网址转向www.wuover.com,但并不是全站301,而一个规范的301是全站性的,即使你输入一个文件的地址如wuover.com/img/site.png也会转向www.wuover.com/img/site.png的,但是这个不可以,所以蜘蛛会爬取wuover.com的内容。再来看看全站的301规则语句:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^wuover.com$
RewriteRule ^(.*)$ http://www.mizuiren.com/$1 [R=301,L]

发现区别了吗?漏一个符号都不行,而网上很多都是缺漏的规则,把我坑惨了。这也是我一直纳闷的问题,为什么在百度站长平台查看到的wuover.com和www.wuover.com的收录数量一直都不一样,原来有些网址它是双向收录了。


以下是规范语句的详细解释(比如说把根域名301转向到/blog):
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?wuover\.com$
RewriteRule ^(.*)$ /blog/$1 [R=301,L]
【RewriteEngine On】

表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。

【RewriteCond %{HTTP_HOST} ^(www\.)?wuover\.com$】

这是重写条件,前面%{HTTP_HOST}表示当前访问的域名,格式是www.xxx.com,不包括“http://”和“/”,^表示 字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次(即存在与不存在),这句规则的意思就是如果访问的网址是xxx.com或者 www.xxx.com就执行下面的语句,不符合就跳过。

【RewriteRule ^(.*)$ /blog/$1 [R=301,L]】

重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是^(.*)$中 的.* ,这个非常重要。L表示语句的结束标记。

补充(对于某些主机而言):RewriteRule ^(.*)$ /blog/$1 前部分 ^(.*)$ 将会匹配当前请求的哪个url?

例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。

答案是:根据RewriteBase规则规定,如果rewritebase 为/,将会匹配a.html,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase 为/ ,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:RewiteBase /

还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的,但从我的主机测试得来,加了这个[NC]反而不能实现全站301,所以这个是可以去掉的(去掉也不碍事),如果你的服务器真的区分大小写那就那[NC]加上:

RewriteEngine On
RewiteBase /
RewriteCond %{HTTP_HOST} ^(www\.)?wuover\.com$ [NC]
RewriteRule ^(.*)$ blog/$1 [R=301,L]

目录: 常识大全 | 标签: | 11212次阅读