代码之家  ›  专栏  ›  技术社区  ›  Nicolò Martini

为什么在php中通过header('location..')重定向后必须调用'exit'?

  •  53
  • Nicolò Martini  · 技术社区  · 15 年前

    要知道,如果要在php中重定向用户,可以使用header函数:

    header('Location: http://smowhere.com');
    

    众所周知,将 exit; header 调用,以防止执行其他php代码。所以我的问题是:头位置调用后的代码能有效执行吗?在什么情况下?恶意用户能否完全忽略 header('Location..') 打电话?怎么用?

    6 回复  |  直到 15 年前
        1
  •  57
  •   Pekka    15 年前

    头位置调用后的代码能有效执行吗?

    是的,总是。这个 header 只是一行数据 询问 要重定向的浏览器。这一页的其余部分 仍将被送达 通过php,客户端可以通过简单地阻止 页眉 来自执行的命令。

    对于命令行客户机 wget 例如,简单地告诉它不要遵循重定向。

    一句话:如果你不阻止它,即使在 页眉 打电话。该机构是完全可用的收件人没有任何特殊的黑客技能。

        2
  •  25
  •   Alix Axel    15 年前

    如果你重定向但你没有 die() / exit() 代码总是被执行和显示 .

    举个例子:

    小精灵:

    if (authenticationFails)
    {
        // redirect and don't die
    }
    
    // show admin stuff
    

    如果不确保在location头之后结束执行 每一个 用户将获得访问权限。

        3
  •  8
  •   Pascal MARTIN    15 年前

    header() 指示php发送http头…当发送http头时。

    当您编写对header()的调用时,这些不是立即发送的,而是在该发送它们的时候。 (通常,当php需要开始发送响应的主体时——这可能比您想象的要晚,当 output_buffering 是的) .

    所以,如果你打电话 标题() ,绝对不能保证在该语句之后编写的代码不会被执行,除非使用 exit / die .

    用户可以忽略 Location 如果他想的话,可以使用header;但是它不会改变调用 标题() 可能执行,也可能不执行:这是服务器端的问题。

        4
  •  1
  •   Alister Bulman    15 年前

    将在header()之后运行php代码。有时,这是必需的,因为 example 在php.net上显示。为了确保它不是,您完全结束程序流。

        5
  •  1
  •   Steven Smethurst    15 年前

    回复:可以有效地执行头位置调用后的代码吗?

    是的,如果你不关闭脚本。

    回复:在哪些情况下?

    在任何情况下。

    恶意用户能否完全忽略头('location..')调用?

    不,它会被要求用户在这件事上没有发言权。

        6
  •  1
  •   Marc B    15 年前

    如果没有exit调用,脚本终止的确切时间点将归结为两个因素:

    1. 客户端浏览器对重定向的反应速度
    2. 执行脚本的其余部分需要多长时间。

    假设浏览器在看到位置标题时立即启动重定向操作。这意味着它将关闭重定向所来自的连接,以便开始连接到新位置。这通常意味着web服务器将终止重定向脚本。无论头从服务器->客户端转到客户端需要多长时间,TCP链接关闭过程从客户端->服务器转到客户端需要多长时间,都是脚本可以继续运行的时间。