提醒:本页面将不再更新、维护或者支持,文章、评论所叙述内容存在时效性,涉及技术细节或者软件使用方面不保证能够完全有效可操作,请谨慎参考!

一般来说Web网站都是喜欢带www的,但是我觉得我的网站带www前缀有些略显不雅,所以我决定把www转向到不带www的域名上来,通常情况下使用 301重定向

以前自己用ASP写过个转向的代码片段,供大家参考:

<%
Dim g_ReqServer
g_ReqServer = Request.ServerVariables("SERVER_NAME")
If InStr(1, g_ReqServer, "www.", 1)<>0 Then
    Response.Status="301 Moved Permanently" 
    Response.AddHeader "Location", "http://" &_
        Replace(LCase(g_ReqServer), "www.", "") &_
             Request.ServerVariables("PATH_INFO") & "?" &_
                    Request.QueryString()
    Response.End
End If
%>

这里解释下,首先Request.ServerVariables("SERVER_NAME")获取访问所使用的主机域名,然后通过InStr判断是不是包含www.,如果包含则返回301状态。紧接着拼接出新的网址,新的网址必定由http:// + 去掉www.的主机域名(这里调用Replace函数替换) + 所请求文件的路径信息PATH_INFO + '?' + 所请求的字符串,之所以称为“自适应”是因为对于任何的URL,都只是单纯的去掉www.,原路径不变,所以问号和请求字符串就尤显重要了,如果省掉就可能导致查询字符串的丢失。

后来初学PHP,也照样子写过一段代码,如下:

<?php
$server_name = $_SERVER['SERVER_NAME'];
if(!stristr($server_name, 'www.')) {
 $pathinfo = parse_url($_SERVER['REQUEST_URI']);
 header("HTTP/1.1 301 Moved Permanently");
 header("Location: http://www." . $server_name . 
    $_SERVER['PHP_SELF']."?".$pathinfo['query']);
}
?>

基本原理是一样的,只不过要获得?后面的一大串查询字符串需要调用parse_url。

值得注意的是上述两段代码片段必须加在访问的页面代码顶端,也就是在任何Response或者echo输出之前,否则就失效了。

后来通过网上查询获得了个更好的方法,那就是 .htaccess ,在 .htaccess 的 里面添加下面的代码:

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

初学 .htaccess ,感觉有点正则表达式的味道,首先匹配主机域名,如果是www.wangye.org就进行R=301的重定向。

2011年3月10日更新

Aaron Saray 的博客上看到了个 比较好的写法 ,包含了两种情况,分别是有带www的转向不带www的和不带www的转向带www,特别记录下来。

RewriteEngine On
RewriteBase /
 
#require WWW
RewriteCond %{HTTP_HOST} !^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L] 
 
#OR

#do not require www
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

2011年7月3日更新

根据 未来往事 所反映的关于PHP代码实现跳转,在处理URL重写(URL Rewrite)的情况下会丢失重写,回到原始带查询参数的链接地址,为此我将相关代码修改如下:

<?php
// 定义你自己的URL路由表
// 比如下面的路由表将会把
// read.php?paramA=1&paramB=2&paramC=3
// 变成
// /post/1/2/3/
$router = array(
  'read.php'=>'/post/'
);
$server_name = $_SERVER['SERVER_NAME'];
if(!stristr($server_name, 'www.')) {
  $fn = explode('/', strtolower($_SERVER['PHP_SELF']));
  if (array_key_exists($fn[0], $router)) {
    $path = $router[$fn[0]] .
      implode('/',
        array_filter($_REQUEST,
           create_function('$v','return !empty($v);')));
  } else {
    $pathinfo = parse_url($_SERVER['REQUEST_URI']);
    $path = $_SERVER['PHP_SELF']."?".$pathinfo['query'];
  }
  header("HTTP/1.1 301 Moved Permanently");
  header("Location: http://www." . $server_name . $path);
}
?>

总结最后,还是建议大家在条件允许的情况下尝试采用301的DNS转向,目前有些DNS服务商已经免费提供这项功能。

  1. 301重定向 : 301代表永久性转移(Permanently Moved),301重定向是网页更改地址后对搜索引擎友好的最好方法,只要不是暂时搬移的情况,都建议使用301来做转址。 [更多]
  2. .htaccess : Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过.htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。 [更多]