以下是代码片段: HTTP/1.1 301 Moved Permanently Cache-Control: private, max-age=2592000 Content-Length: 235 Content-Type: text/html; charset=UTF-8 Date: Mon, 11 Jan 2010 13:58:44 GMT Expires: Mon, 11 Jan 2010 13:58:44 GMT Location: http://www.google.cn/webhp?source=g_cn Server: gws X-XSS-Protection: 0 |
此状态明显说明301永久重定向,但是从定向到哪里呢??看下面有一个Location: http://www.google.cn/webhp?source=g_cn,Location的意思是位置,一个3xx的请求必须包含Location字段信息,否则将不知道转向到哪里。
在程序中实现3xx状态
ASP:
在ASP的编程中有一个方法或者说是函数可以控制状态行的字符,并且可以添加Location这样的字段。
以下是代码片段: % Response.Status = 301 ‘表示状态切换成301 Response.AddHeader “Location”,”http://www.baidu.com/” ‘在头中添加Location字段,其内容是百度的网址。 %> |
以下是代码片段(精确重定向): % Response.Status = 301 ‘表示状态切换成301 Response.AddHeader “Location”,”http://www.baidu.com/”Request.ServerVariables(“HTTP_X_REWRITE_URL”) ‘在头中添加Location字段,其内容是百度的网址。 %> |
这是永久重定向的实现方法,有人说Response.Redirect也可以重定向,但是你最好用HttpWatch看看到底是不是301!
Request.ServerVariables(“HTTP_X_REWRITE_URL”)是ASP中获得请求路径的方法。
PHP:和ASP一样,也是两步
以下是代码片段: ?php header(“HTTP/1.1 301 Moved Permanently”); header(“Location: http://www.baidu.com/”); ?> |
以下是代码片段(精确重定向): ?php header(“HTTP/1.1 301 Moved Permanently”); header(“Location: http://www.baidu.com/”.$_SERVER"REQUEST_URI"]); ?> |
在PHP中header()这个方法直接可以对HTTP头部信息进行操作,如果不写“header(“HTTP/1.1 301 Moved Permanently”); ”这个的话也可以转向,不过和ASP的Response.Redirect一样,状态不会是301而是300。
ASP.net:也是两步
以下是代码片段: %@ Page Language=”C#” %> % Response.Status = “HTTP/1.1 301 Moved Permanently”; Response.Headers.Add(“Location”, http://www.baidu.com/); %> |
以下是代码片段(精确重定向): %@ Page Language=”C#” %> % Response.Status = “HTTP/1.1 301 Moved Permanently”; Response.Headers.Add(“Location”, “http://www.baidu.com/”.Request.ServerVariables(“HTTP_X_REWRITE_URL”)); %> |
策略
要实现重定向,就要保证用户访问的所有地址都执行了上面的代码,如果有条件可以将所有请求Rewrite到一个这样的文件,如果不行,就想办法都要执行这个代码,其中有很多办法,比如dedecms无论访问什么地址都执行了common.inc.php这个文件,大家就可以上面的代码放到这个文件中。
另外同一空间实现判断重定向,如果一个空间绑定了两个域名
http://www.111.cn
http://www.111.com
如果用户访问的是http://www.111.cn/index.asp?page=2这样的网站重定向到http://www.111.com/index.asp?page=2,在同一空间如何实现,这里是以ASP编程做的例子,如果想判断是cn的域名就进行转向,不是com的域名就不转向可以通过编程方法实现判断
以下是代码片段(精确重定向): % comDomain = “www.111.com” ‘定义COM域名
If Request.ServerVariables(“SERVER_NAME”) > comDomain Then ‘如果请求的域名不是com的域名 |
补充一下:Apache 服务器可以直接在 .htaccess 文件中实现 301 重定向。