重定向对于我们来讲就是301了,但在php中用重定向会使用到header函数了,下文我们介绍的主要是一些状态代码与使用方法的例子。
重定向是一个看似简单,实际很复杂的问题。http状态码一共才五个系列(1xx,2xx,3xx,4xx,5xx),而重定向状态码被单独作为一个系列(3xx)存在,足以说明它的重要性,但是很多人认为知道301/302的区别就算熟悉重定向了,这实在是一大谬误。本文主要介绍一下303/307。
为了方便测试,首先熟悉一下如何使用curl命令得到响应头:
-i/–head
(http/ftp/file) fetch the http-header only! http-servers feature the command head which this uses to get nothing but the header of a document. when used on a ftp or file file, curl displays the file size and last modification time only.
例子命令:curl -i http://www.google.com/
通常php里的重定向是这样的:
header('location: http://localhost/');exit();
通过curl命令访问如上的代码,我们将得到如下响应头:
http/1.1 302 foundlocation: http://localhost/
如上的重定向代码在编程里很常用,比如说添加文章成功后,跳转回列表页,不过这里的重定向状态码302却是值得商榷的。
这还得从头说起,在http1.0的时代,那时候302的名字还是“moved temporarily”,但在实际使用上,302往往包含了两方面的意思(也就是后来的303/307),为了消除可能的混淆,在http1.1中,302被重命名为“found”,并新加了303(see other)和307(temporary redirect),至于php之所以在重定向时缺省使用302状态码是为了兼容的目的,所以不到不得已(有时候,客户端是http1.0的,只理解302),不应该使用302。
303和307都把重定向的uri置于location头中,他们的区别在于:
303:对于post请求,它表示请求已经被处理,客户端可以接着使用get方法去请求location里的uri。
307:对于post请求,表示请求还没有被处理,客户端应该向location里的uri重新发起post请求。
下面看看php如何发送非302的重定向,以303为例:
// 第一种方法
header('location: http://localhost/', true, 303);
// 第二种方法
header('http/1.1 303 see other');header('location: http://localhost/');
使用curl命令,你就会看到如下响应头:
http/1.1 303 see otherlocation: http://localhost/
总结,本文说的主要是303/307之间的关系。之所以明确区分是为了让状态码本身能够准确的表达响应的含义,从而尽可能的避免对重定向的滥用。
永久地址:
转载随意~请带上教程地址吧^^