zoukankan      html  css  js  c++  java
  • 重定向简单么?不,它很复杂!

    重定向简单么?不,它很复杂!_老王的技术手册 ( 我的新博客:http://huoding.com )_百度空间

    重定向简单么?不,它很复杂!

    作者:老王

    重定向是一个看似简单,实际很复杂的问题。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
  • 相关阅读:
    一些比较水的题目
    oracle not in,not exists,minus 数据量大的时候的性能问题
    简单的oracle分页语句
    oracle 查询结果集运算
    Spring注解详解
    HTTP报头Accept 和 Content-Type的区别
    vue 实现分转元的 过滤器
    oracle or语句的坑
    CSS样式 让你的输入的小写自动变成大写。
    js 十分精确身份证验证
  • 原文地址:https://www.cnblogs.com/lexus/p/2702138.html
Copyright © 2011-2022 走看看