php 301转向的实现方法分享

发布时间:2020-02-17编辑:脚本学堂
本文介绍下,在php编程中实现301跳转的方法,有需要的朋友参考下。

本节内容:
php实现全站的所有内页的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
第三,收录不会因为域名更换没有.

下面来看一个php 301重定向的例子,如下:
 

复制代码 代码示例:
<?php
$url="http://www.jb200.com".$_SERVER["REQUEST_URI"];
header("HTTP/1.1 301 Moved Permanently");
header ("Location:$url");
?>

以Discuz6.0为例子
index.php
archiver/index.php
forumdisplay.php
viewthread.php
space.php
tag.php
blog.php
找到原来的老的域名中的上列文件,加入上面的代码,然后更新即可。

使用curl测试下:
 

复制代码 代码示例:
#curl -I http://www.bbbb.com/sssss.php
HTTP/1.0 301 Moved Permanently
Date: Tue, 06 May 2008 06:27:39 GMT
Server: apache
Location: http://www.jb200.com/sssss.php
 

如见到上面的HTTP/1.0 301 Moved Permanently时,就表示可以了.下次只要点相关的链接,会自动转向新的链接,搜索引擎也会自动更新成新的链接。

301重定向实现方法,及对网站优化的作用

301重定向(也叫301转向,301跳转)对网站优化所起的作用是不可忽视的,尤其是针对SE(搜索引擎)处理网站页面权重的时候,更加显得重要。网站换了新域名,默认首页需要跳转等,从SEO角度来说,我们都建议使用301重定向,而不是JS跳转或META REFRESH或302转向,这些很容易引来SE的惩罚。

 什么是301重定向呢? 

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

为什么要用301转向? 

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

关于301转向和网址规范化问题,大家可以去阅读下ZAC写的文章。本文,仅仅讨论在ASP环境下,如何设置301重定向问题;其他语言亦可参考。 

网站的首页一般有以下几种: 

http://jb200.com 
http://www.jb200.com 
http://jb200.com/index.asp 
http://www.jb200.com/index.asp 
…… 

很自然的,以上的这些网址形式都指向到了一个网站,如果在搜索引擎中都启用这些形式,那么,网页权重,PR都会分散到这几个网址上,虽然,它们都是一个网站,而这不是我们想要的结果。那么,如何将以上的首页形式都定向到自己想要的网址上呢,比如http://www.jb200.com,从而使得这些分散的网页权重,PR都集中到www.jb200.com上。这里就需要使用301永久重定向了。 

ASP语言下,需要在默认首页,如index.asp顶部最上方加入以下代码: 
 

复制代码 代码示例:
<% 
Dim dm,sn 
dm=Request.ServerVariables("Server_name")  '获取域名 
'这里的3是指www的长度 
if left(dm,3)<>"www" then 
Response.Status="301 Moved Permanently"  
Response.AddHeader "Location", "http://www.jb200.com" 
Response.End 
end if 
%> 
 

也可以根据实际需要对本代码进行适当的修改以适合你需求的样式。本代码自动校验没有输入www的,301跳转到www.jb200.com这个网址上,从而使得网页权重得到累加,达到seo优化的目的。 

问题:
如果有链接指向到http://www.jb200.com/index.asp(比如站内链接),那么搜索引擎也同样会给这个网址形式加分,虽然index.asp是默认首页,但我们希望的是把所有权重都给与http://www.jb200.com这个形式。有人说,这两个形式不是都一样吗?不一样。比如:http://www.jb200.com的PR为0,而http://www.jb200.com/index.asp的PR为2。从这点可以看出,SE是给与是否有index.asp的网址形式以不同的权重的。而使用Request.ServerVariables("SCRIPT_NAME")或Request("url")获取到的后缀无论输入时是否带有index.asp都一律返回index.asp,从而导致无法判断,也无法使用301重定向,当然这是指仅asp语言环境。 

解决方法:
利用js获取当前网址window.location.href,然后把这个当前网址写入cookies;asp读取这个cookies,从而判断网址中是否包含index.asp,如果包含,就使用301重定向。建议:在任何链接中避免有直接指向index.asp的形式,包括外链及内链,尤其是内链。这只是一个折中的方法。 

利用js通过cookies给asp传递网址: 
 

复制代码 代码示例:

<script language="javascript">  
var url=window.location.href.toLowerCase(); //小写  
document.cookie = "urlck" + "=" + escape(url);  
</script>  

<%  
Dim sn  
sn=request.cookies("urlck")  '获取后缀  
response.cookies("urlck")=""  '清空cookies  

if right(sn,11)="default.asp" then  
Response.Status="301 Moved Permanently"   
Response.AddHeader "Location", "http://www.jb200.com"  
Response.End  
end if  
%> 

但是很遗憾,如果这些网址形式不是实际上的人为输入,而是搜索引擎访问的结果,搜索引擎又是忽略JS的,也就是说,js里赋值的cookie并不能被SE识别,从而导致也无法使用301跳转。这个问题有待解决。 

其他语言下的301重定向: 

1、Unix/linux+Apache主机,在.htaccess文件中增加301转向指令,采用 mod_rewrite 技术,如:PHP代码 
 

复制代码 代码示例:
Options +FollowSymLinks       
RewriteEngine on       
RewriteCond %{HTTP_HOST} ^www.jb200.com [NC]       
RewriteRule ^(.*)$ http://jb200.com/$1 [L,R=301]    

2、Window+IIS主机,在服务器软件的系统管理员配置中设置,方法: 
打开Internet信息服务管理器,在欲重定向的网页或目录上按右键,选中“重定向到URL”,在对话框中输入目标页面的地址,记得选中“资源的永久重定向”->“应用” 。 

3、用PHP/ASP .NET实现301转向(HTML无法做301转向),方法如下: 

1)用PHP实现 
 

复制代码 代码示例:
<? Header( "HTTP/1.1 301 Moved Permanently" );      
Header( "Location: http://jb200.com" );?>    

2)用ASP.NET实现 
ASP/Visual Basic代码 
 

复制代码 代码示例:
<script runat="server">      
private void Page_Load(object sender, System.EventArgs e)      
{      
Response.Status = "301 Moved Permanently";      
Response.AddHeader("Location","http://jb200.com");      
}      
</script>    

经过这些设置后,301转向应该可以配置OK啦,如果想检查一下是否正确,则可以使用网上提供Server Header检查工具,如Check Server Headers Tool - HTTP Status Codes Checker。 

用以上检测http状态码工具,可以做个简单的检查,如检查http://jb200.com,返回的结果: 
 

#1 Server Response: http://jb200.com 
HTTP Status Code: HTTP/1.1 301 Moved Permanently 
Connection: close 
Date: Mon, 25 Feb 2008 01:54:09 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
Location: http://www.jb200.com 
Content-Length: 0 
Content-Type: text/html 
Set-Cookie: ASPSESSIONIDACBCSBDR=FCJELLLALFNPOCMBNMOLMJHN; path=/ 
Cache-control: private 
Redirect Target: http://www.jb200.com 

#2 Server Response: http://www.jb200.com 
HTTP Status Code: HTTP/1.1 200 OK 
Connection: close 
Date: Mon, 25 Feb 2008 01:54:13 GMT 
Server: Microsoft-IIS/6.0 
X-Powered-By: ASP.NET 
Content-Length: 29330 
Content-Type: text/html 
Set-Cookie: ASPSESSIONIDACBCSBDR=GCJELLLAECPBADKMADAJOBLC; path=/ 
Cache-control: private 
 

注意,以上返回的结果中第二行“HTTP Status Code: HTTP/1.1 301 Moved Permanently”,说明这个网址采用了301永久重定向功能了,设置成功。