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

你知道,如果你想在PHP中重定向一个用户,你可以使用头函数:

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

众所周知,放置exit;也是一个好的做法exit;header调用之后,防止执行其他的php代码。 所以我的问题是:可以有效地执行标题位置调用后的代码? 在哪种情况下? 恶意用户是否可以完全忽略header('Location..')调用? 怎么样?

标题位置调用之后的代码是否可以被有效地执行?

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

比如说,像wget这样的命令行客户端就足够简单了,只要告诉它不要遵循重定向。

底线:如果你不阻止它,即使在header调用之后,PHP也会发出全身的信号。 该机构完全可用的接收方没有任何特殊的黑客技能。

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

以下面的例子:

admin.php的:

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

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

header()指示PHP应该发送一个HTTP头…在发送HTTP头时。

而且,当你将这个调用写到header()时,这些不是立即发送的,而是当它们发送的时候(通常,当PHP需要开始发送响应的主体时 – 这可能比你想象的要晚,当output_buffering是使用)

所以,如果你只是调用header() ,绝对保证在这个语句之后编写的代码不会被执行 – 除非你指出它不能,通过使用exit / die

用户可以忽略Location标题,如果他想要的话; 但是它不会改变任何事情,因为header()调用之后的代码可能会或可能不会被执行:这个问题是服务器端的。

PHP代码在一个header()之后将会运行。 有时候,这是必需的,就像php.net上的例子所示。 为了确保它不是,您完全结束程序流程。

re:header-location调用后的代码能否被有效地执行?

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

re:在哪种情况下?

在任何情况下。

恶意用户能否完全忽略标题('Location ..')的呼叫?

不,这将使得用户在这件事上没有发言权。

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

  1. 客户端浏览器响应重定向的速度有多快
  2. 剩下的脚本要执行多少时间。

假设浏览器立即在看到“位置”标题的时刻开始重定向操作。 这意味着它将关闭重定向到的连接,所以它可以开始连接到新的位置。 这通常意味着Web服务器将终止重定向脚本。 然而,从服务器 – >客户端发送头文件需要很长时间,并且从客户端 – >服务器进行的TCP链接关闭过程是脚本可以继续运行的时间。