当前位置:首页 »“秋了秋”个人博客 » 科普常识 » 301的规范写法,你写对了么?

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

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

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

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

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

RewriteEngine on RewriteCond %{HTTP_HOST} ^netblog.site$ RewriteRule ^$ //netblog.cn/ [R=301,L]

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

RewriteEngine onRewriteCond %{HTTP_HOST} ^netblog.site$RewriteRule ^(.*)$ //netblog.cn/$1 [R=301,L]

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


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

0
文章作者: “秋了秋”个人博客,本站鼓励原创。
转载请注明本文地址:http://netblog.cn/blog/194.html
目录: 科普常识标签: Htacess语法 14800次阅读

请求播放音乐,请点击播放

登 录
点击获取验证码
还没账号?点击这里