首页IT科技重定向的用法(重定向简单么?不,它很复杂!)

重定向的用法(重定向简单么?不,它很复杂!)

时间2025-05-03 12:04:15分类IT科技浏览4773
导读:作者:老王 重定向是一个看似简单,实际很复杂的问题。HTTP状态码一共才五个系列(1XX,2XX,3XX,4XX,5XX),而重定向状态码被单独作为一个系列(3XX)存在,足以说明它的重要性,但是很多人认为知道301/302的区别就算熟悉重定向了,这实在是一大谬误。本文主要介绍一下303/307。...

作者:老王

重定向是一个看似简单             ,实际很复杂的问题             。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 Found

Location: 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 Other

Location: http://localhost/

总结      ,本文说的主要是303/307之间的关系                   。之所以明确区分是为了让状态码本身能够准确的表达响应的含义         ,从而尽可能的避免对重定向的滥用            。

参考文档:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

声明:本站所有文章                   ,如无特殊说明或标注         ,均为本站原创发布   。任何个人或组织      ,在未征得本站同意时                   ,禁止复制            、盗用                   、采集       、发布本站内容到任何网站         、书籍等各类媒体平台                   。如若本站内容侵犯了原著者的合法权益            ,可联系我们进行处理               。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
SconsVsOtherBuildTools SCons Wiki python 数据统计图(PyG教程(2):图数据)