今天 XX 群里的一位朋友问小编更换域名后的 WordPress 网站怎么做 301 重定向啊,小编蛋疼了,为啥总是有人来问这类 XXX 的问题呢,所以小编直接甩了一句自己百度谷歌去。过了几分钟这位仁兄又来,还说百度谷歌来的 301 重定向代码都不管用。 X 了个 X 怎么可能没用呢!小编实在无语了只好自己谷歌了一段代码丢给这位仁兄,这位仁兄回了句,这代码就是他现在用的,只能把域名重定向过去,而所有的旧页面链接却没有正确的定向到新的连接上。小编试了下果然如此,只是做了主域名的重定向,而没有正确把其他页面都定向到新域名上。好吧继续百度谷歌,发现搜出来的代码基本都大同小异,根本没有一个正确的将整站链接都 301 重定向的代码。没办法只好自己动手了,首先在根目录下新建一个.htaccess 加入一下代码:

RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

以上代码的作用是将所有请求都转发给 index.php 来处理,当然你使用其它文件名也行,然后再 index.php 中加入以下代码:

<?php
$the_host = $_SERVER['HTTP_HOST'];//取得进入所输入的域名
$request_uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '';//判断域名后面的请求部分
if($the_host !== 'weixiaoduo.com')//weixiaoduo.com 是新域名
{
    header('HTTP/1.1 301 Moved Permanently');//发出 301 状态码
    header('Location: http://www.weixiaoduo.com'.$request_uri);//跳转到我的新域名地址
    exit();
}
?>

这样就可以将所有旧域名上的链接重定向到新域名上了,另外提醒下使用此方法做 301 重定向时必须新建一个空间或者单独的目录来单独的做 301 重定向,如果是使用网站空间同一个空间并且在同一目录的话会造成服务器错误导致网站无法访问。

代码演示:随便在本站找个可以访问的页面在域名前面加上 www 就可以看到效果了。

(题外话:百度时无意中发现一个帖子,发帖的说他花了一天的时间把旧域名上的链接都重定向到新域名上了,写的.htaccess 文件足足有 10 多 MB 大小,估计这位发帖的仁兄是一条链接一条链接的重定向吧,笑死了 (*^__^*)…不知道他哪来的毅力。)


2013.8.7 更新:今天有个童鞋问他用的是 win 主机那么如何来实现全站 301 转跳呢?实现方法:使用 httpd.ini 代替.htaccess 将请求转发给 index.php

代码如下:

[ISAPI_Rewrite]
RewriteRule ^/$ /index.php [L]
RewriteRule /(.*) /index.php/$1 [L]

索性把 nginx 的代码也贴出来:

location / {
        index index.html index.php;
        if (-f $request_filename/index.html){
            rewrite (.*) $1/index.html break;
        }
        if (-f $request_filename/index.php){
            rewrite (.*) $1/index.php;
        }
        if (!-f $request_filename){
            rewrite (.*) /index.php;
        }
    }

将以上代码加入到 nginx.conf 文件的 Server 段内。

所有不同的 web 环境下的第一步骤代码都不一样,但是 index.php 的代码不变。 (PS:不一定是使用 WordPress 的朋友才可以使用这种方法来做 301 重定向,任何程序都可以噢,但是必须要服务器支持 php 才可以。)