为什么我必须在PHP中通过标题('Location ..')重定向后调用'exit'?

时间:2010-04-30 21:24:17

标签: php redirect header location

您知道如果要在PHP中重定向用户,可以使用标题函数:

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

众所周知,在exit;调用之后加上header是一个好习惯,以防止执行其他php代码。所以我的问题是:标头位置调用后的代码能否有效执行?在哪些情况下?恶意用户能否完全忽略header('Location..')电话?怎么样?

6 个答案:

答案 0 :(得分:58)

  

可以有效执行header-location调用后的代码吗?

是的,永远。 header只是要求浏览器重定向的一行数据。页面的其余部分仍然由PHP提供,客户​​端可以通过简单地阻止header命令执行来查看。

这对于像wget这样的命令行客户端来说很容易,例如,只是告诉它不要遵循重定向。

底线:如果你不阻止它,即使在header电话后,PHP也会发送出全身。没有任何特殊的黑客技能,该机构完全可供收件人使用。

答案 1 :(得分:25)

如果您重定向但没有die() / exit() ,则始终会执行并显示代码

采用以下示例:

admin.php的:

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

// show admin stuff

如果您不确定在位置标题每个用户获得访问权限后结束执行。

答案 2 :(得分:8)

header()指示PHP应该发送HTTP标头...发送HTTP标头时。

当你编写对header()的调用时,这些并不是立即发送的,但是当它发送它们的时候(通常,当PHP需要开始发送响应的主体时 - 这可能晚于你认为,当output_buffering被启用时

所以,如果你只是调用header(),绝对保证不会执行在此语句之后编写的代码 - 除非你通过exit / {{表明它不能表示它1}}。

用户可以根据需要忽略die标题;但是,Location调用后的代码可能会执行也可能不执行,这一事实不会改变:该问题是服务器端的。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

re:有效执行header-location调用后的代码吗?

如果您不关闭脚本,请单击“是”。

re:在哪些情况下?

在每种情况下。

恶意用户是否可以完全忽略标题(“位置..”)调用?

不,它会被解决,用户对此事没有发言权。

答案 5 :(得分:1)

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

  1. 客户端浏览器对重定向的反应速度
  2. 执行其余脚本需要多长时间。
  3. 假设浏览器立即启动重定向操作,只要它看到Location标头出现。这意味着它将关闭重定向所来自的连接,因此它可以开始连接到新位置。这通常意味着Web服务器将终止重定向脚本。无论标头从服务器 - >客户端进行,并且从客户端到服务器的TCP链接关闭过程需要多长时间才能使脚本继续运行。