PHP使用header+Location实现网站301重定向

今天没事做.准确的说这几天都没啥事做.想写点东西.又不知道写什么.所以去最大同性交友社区找了个点别人的项目.想呢借鉴下别人的写法.

然后下载到了一个用Thinkphp3.2搭建的博客.上古版本.本来没打算研究.但是好像又和之前用过的不一样.顶部文件多了个Admin文件夹.点进去.就一个默认的index文件.里面内容也很简单.

这个header函数做了个重定向.这样输入地址栏输入admin的话会自动跳转到后台界面.仔细想了下.可能这就是说的懒是推动科学进步的第一动力.

既然重定向了.那么也是看了下返回的状态码.意外发现返回的状态码为302.

那么301和302以及各返回码有啥区别呢?

301

被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。新的永久性的URI应当在响应的Location域中返回。除非这是一个HEAD请求,否则响应的实体中应当包含指向新的URI的超链接及简短说明。如果这不是一个GET或者HEAD请求,因此浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。注意:对于某些使用HTTP/1.0协议的浏览器,当它们发送的POST请求得到了一个301响应的话,接下来的重定向请求将会变成GET方式。

302

要求客户端执行临时重定向(原始描述短语为“Moved Temporarily”)。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。新的临时性的URI应当在响应的Location域中返回。除非这是一个HEAD请求,否则响应的实体中应当包含指向新的URI的超链接及简短说明。如果这不是一个GET或者HEAD请求,那么浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。注意:虽然RFC 1945和RFC 2068规范不允许客户端在重定向时改变请求的方法,但是很多现存的浏览器将302响应视作为303响应,并且使用GET方式访问在Location中规定的URI,而无视原先请求的方法。因此状态码303和307被添加了进来,用以明确服务器期待客户端进行何种反应。

(以上说明转自汕大小吴博客,该文章也是对状态码进行了下详尽的阐述.)

搜索引擎返回302错误表示被请求的资源暂时转移(Moved temporatily),然后会给出一个转移后的URL,而浏览器在处理服务器返回的302错误时,原则上会重新建立一个TCP连接,然后再取重定向后 的URL的页面;但是如果页面存在于缓存中,则不重新获取。但是,由于黑帽SEO滥用302重定向进行作弊,302重定向已经被视为垃圾信息,遭到各大搜索引擎的打击。因此,上面的代码返回302状态是不完善的,也是存在被百度等搜索引擎K站的风险的。

所以简单修改下

上面的这一段代码可以说是解决了使用Location产生302状态的问题,因此是比较完善的也是比较安全的网站重定向方法。

 

2
说点什么

avatar
1 Comment threads
1 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
2 Comment authors
阿桑奶爸de笔记 Recent comment authors
  Subscribe  
最新 最旧 得票最多
提醒
奶爸de笔记
游客

肯定有人会说直接用nginx就行了。