怎样设置301重定向

2011年1月5日 | 分类: 【技术】

在老门的《2010年Alexa排名百强中文网站域名分析报告》中统计了其中未解析根域名的域名:cncmax.cn(联通)、icbc.com.cn(工商银行)、cmbchina.com(招商银行)三个。

“这么大的三家公司,竟然不解析根域名,尤其是身为宽带提供商的联通。 除了这三家,老门还发现排名125位的weather.com.cn(中国天气网)也没解析根域名,太不给力了。老门一直在想他们为什么不解析,不需要解析?可像老门这样的懒人经常不愿意多输入3个w。为安全考虑?做个域名重定向,没有任何安全问题啊。”

OK,即便把www.amon.org和amon.org都分别解析到网站,但这样做会分散搜索引擎对网站的权重。但301重定向能完美解决。

把下面的代码放到.htaccess文件,在最后一行加入吧:

Options +FollowSymlinks
RewriteEngine on
rewritecond %{http_host} ^amon.org [nc]
rewriterule ^(.*)$ http://www.amon.org/$1 [r=301,nc]

参考资料:

当启用新域名需要导入原网站所有内页的流量,或者利用闲置域名的流量,同时兼顾SEO问题的话,设置域名301转向,是一个较好的解决方法。

301转向是什么呢?301转向(或叫301重定向,301跳转))当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息(header)中的状态码的一种,表示本网页永久性转移到另一个地址。其它常见的状态码还包括,200表示一切正常,404网页找不到,302暂时转向,等等。

网址转向方法主要包括:301转向,302转向,JavaScript转向,PHP/ASP/CGI转向,META REFRESH网页META刷新等。302转向可能会有URL规范化问题。其它方法都是常用的作弊手法,当然不是说不可以正当地用,方法本身没有错,但 被作弊者用多了,搜索引擎对这些可疑的转向都很敏感。何必冒险呢。

301转向的必要性在于:当网页A用301重定向转到网页B时,搜索引擎可以肯定网页A永久的改变位置,或者说实际上不存在了,搜索引擎就会把网页B当作唯一有效目标。好处是:

  • 没有网址规范化问题
  • 也很重要的,网页A的PR网页级别会传到网页B
  • 收录不会因为域名更换没有.

例如,我要实现的目标:

  1. 从地址栏上试问 http://www.10114.com时,网址自转跳转到http://amon.org,并要求返回给服务器的状态为301。
  2. 从被搜索引擎收录的页面试问网站时,网址自动跳到新网址所对应的ID,并返回301状态。

其实上面两个问题只是一个问题,就是要保证无论用何种方式试问网站里,要跳到新的域名下显示。

A. PHP实现301转向方法,请看下面的PHP代码

<?php
$url=”http://amon.org”.$_SERVER[“REQUEST_URI”];
header(“HTTP/1.1 301 Moved Permanently”);
header (“Location:$url”);
?>

那么那上面的代码要放到旧网站的那些程序文件里面呢?以Discuz6.0为例:

  1. index.php
  2. archiver/index.php
  3. forumdisplay.php
  4. viewthread.php
  5. space.php
  6. tag.php
  7. blog.php

在旧网站的上列文件,用上面的代码完全替换,然后上传更新就OK了。

B. .htaccess方式实现301转向方法,新建.htaccess文件,输入下列内容(需要开启mod_rewrite)

  • 将不带WWW的域名转向到带WWW的域名下
    Options +FollowSymLinks
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^10114.com [NC]
    RewriteRule ^(.*)$ http://amon.org/  $1 [L,R=301]
    
  • 重定向到新域名
    Options +FollowSymLinks
    RewriteEngine on
    RewriteRule ^(.*)$ http://amon.org/  $1 [L,R=301]
    
  • 使用正则进行301转向,实现伪静态,比如将news.php?id=123这样的地址转向到news-123
    Options +FollowSymLinks
    RewriteEngine on
    RewriteRule ^news-(.+)\
    

C. 测试,用curl软件来检查

#curl -I  http://www.10114.com/test.php

HTTP/1.0 301 Moved Permanently
Date: Tue, 06 May 2008 06:27:39 GMT
Server: apache
Location: http://amon.org/test.php

如见到上面的HTTP/1.0 301 Moved Permanently时,就表示设置好了。任何相关的旧域名链接,会自动转向新域名链接,搜索引擎也会自动更新成新的链接。

有时候网站需要换个域名,此时既要保证原站正常运行,还要做到网站的PR及搜索引擎索引不丢失,这时候,301重定向能完美解决这个需求。

一、搬家更换域名

为了实现后面的完美301转移,需要建立一个新站,即不更改旧站A,建立新站B。

1.备份导入:用命令行或者PHPMyAdmin备份导出旧站A数据库数据,并导入到新站B数据库中。

2.更换域名:做完第一步工作之后,此时新站B尚不能正常访问,还需更改数据库中的域名。

方法一:打开备份数据库文件,使用文本编辑软件比如EditPlus查找替换旧域名为新域名。

方法二:直接在数据库中进行SQL语句查询。在命令行或者PHPMyAdmin下,使用下列查询语句:

UPDATE 表名_options SET option_value =  replace(option_value, ‘旧域名’, ’新域名’) WHERE option_name = ‘home’  OR option_name = ’siteurl’;
UPDATE 表名_posts SET guid = replace(guid, ’旧域名’, ’新域名’);
UPDATE 表名_posts SET post_content = replace(post_content, ’旧域名’, ’新域名’);

然后直接使用/wp-admin/登录后台,打开设置、常规,你会发现这里还是旧域名,把它改正过来,至此,域名更换完成,可以正常访问新站B了。

二、完美301转向

可能有的同学会问,前面的工作也可以在原站A上完成,但为什么还要建立新站B呢?这就完美转移的关键了,其实只要了解WordPress的都会发现,WordPress只能绑定 一个地址,如果你用的是诸如amon.org顶域名作为地址,那就不能用amon.org这个子域作地址,反之亦然。而空间绑定另一个地址的话, 只有首页绑定,内页永久链接是不变的。

因此,我们要建立新站B,旧站A只是提供一个301过渡,这样就形成了一个WordPress的301完美转移。 前面的更换域名做完之后,操作就相当简单。只需把原站A的”.htaccess”文件用文本编辑器打开更改为以下即可(适用于Linux主 机,Windows主机可用其他方式转向)。

# BEGIN WordPress
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine on
rewritecond %{http_host} ^www.a.com [nc]
rewriterule ^(.*)$ http://www.b.com/$1 [L,R=301]
</IfModule>
# END WordPress

做完之后可以301转向测试看一下结果。以后就可以正常使用新站B了,但要注意的是保持旧站A至少两个月不删除,以便新站正常收录。