PHP中重定向头之后的所有代码都会被执行吗?

PHP中重定向头之后的所有代码都会被执行吗?,php,redirect,header,Php,Redirect,Header,因此,我知道一般的经验法则是在PHP中执行头重定向之后,应该调用exit()以避免额外的代码运行,但我想知道是否将代码放在重定向头之后,它是否总是运行 我在Google Analytics中做了一些关于跟踪推荐的各种方法的研究,发现了以下帖子: 它建议这样做: <? Header( “HTTP/1.1 301 Moved Permanently” ); Header( “Location: http://www.new-url.com” ); ?> <script type=

因此,我知道一般的经验法则是在PHP中执行头重定向之后,应该调用exit()以避免额外的代码运行,但我想知道是否将代码放在重定向头之后,它是否总是运行

我在Google Analytics中做了一些关于跟踪推荐的各种方法的研究,发现了以下帖子:

它建议这样做:

<?
Header( “HTTP/1.1 301 Moved Permanently” );
Header( “Location: http://www.new-url.com” );
?>

<script type=”text/javascript”>
var gaJsHost = ((“https:” == document.location.protocol) ? “https://ssl.” : “http://www.”);
document.write(unescape(“%3Cscript src=’” + gaJsHost + “google-analytics.com/ga.js’ type=’text/javascript’%3E%3C/script%3E”));
</script>
<script type=”text/javascript”>
try {
var pageTracker = _gat._getTracker(“UA-YOURPROFILE-ID”);
pageTracker._trackPageview();
} catch(err) {}</script>

var gaJsHost=((“https:==document.location.protocol)?”https://ssl.” : “http://www.”);
write(unescape(“%3Cscript src=”+gaJsHost+“google analytics.com/ga.js”type='text/javascript'%3E%3C/script%3E”);
试一试{
var pageTracker=_gat._getTracker(“UA-YOURPROFILE-ID”);
页面跟踪器。_trackPageview();
}捕获(错误){}
从我对header()函数的理解来看,这取决于浏览器,它可以随时运行重定向。因此,无法保证JavaScript在重定向发生之前实际开始或完成执行

指示重定向后退出的原因是“确保重定向时不会执行下面的代码”。这听起来不像是他们保证所有后续代码都会运行,只是可能会发生

无论如何,我找到了一种不同的方法来实际管理跟踪,但我想看看是否能找到header()在这种情况下的具体工作方式


谢谢你的帮助。

这是比赛条件。一旦重定向头发送到浏览器,浏览器将关闭当前连接并为重定向URL打开一个新连接。在原始连接关闭并且Apache关闭脚本之前,您的代码将继续像以前一样执行


理论上,如果客户机/服务器之间有足够快的连接,并且管道中的任何地方都没有缓冲,那么发出头将导致脚本立即终止。实际上,可以在“现在”和“永远”之间的任何地方启动关闭;它将在浏览器中运行。由浏览器决定是否执行该页面上包含的Javascript;PHP与此无关

对我来说,PHP文档意味着在发送重定向时
标题()下的任何PHP都将继续运行。但它在PHP解释器中“运行”,将JS转储到浏览器中。PHP文档中的内容与浏览器是否运行JS之间没有任何关系。

EDIT

正如Anupam Jain指出的,看起来浏览器在没有得到响应体的情况下不会终止连接,这听起来很合理。所以我重新考虑了我的答案

听起来他们并不能保证下面的代码都能运行

更可能的是,它是一个警告,以防出现不应该执行的合理代码。例如,私人页面内容。所以,除了发送标题外,您还必须确保未发送任何敏感内容,退出看起来是一个非常健壮的解决方案。因此,我将其表述为“确保在重定向时不会执行下面的合理代码。”

因此,无法保证JavaScript在重定向发生之前实际开始或完成执行


确切地说,它似乎与脚本执行无关,而是与浏览器在得到3xx响应后执行任何操作的意愿有关。我想我会测试它,但你也可以测试它。

在PHP中使用header函数只会添加到服务器返回的响应的头中。它不会立即发送任何数据,也不会立即终止连接。将执行
标题
调用后的任何代码

特别是,即使在执行301重定向之后,也最好添加一个响应主体,这样不支持重定向的客户端也会得到一些描述性响应。根据第10.3.2节-

除非请求方法是HEAD,否则响应的实体应该 包含一个简短的超文本注释,其中包含指向新URI的超链接。如果 301状态代码是响应请求而接收的,而不是 GET或HEAD时,用户代理不能自动重定向 请求,除非用户可以确认,因为这可能 更改发出请求的条件


我注意到代码仍然在执行,基于if语句的多个头可能会导致“重定向循环错误”。我习惯于现在添加
die(“重定向…”)在每次头重定向之后,都没有看到问题持续存在。

这是不正确的。发送标头不会关闭连接。事实上,发送带有重定向的响应体是正常的,而不是例外。我没说它会。我说过浏览器会在收到标题后关闭连接-它应该在那里查看--->所以没有必要加载更多的文档,因为这些文档会被丢弃。这也是不正确的。如果不下载完整的响应正文,浏览器将无法关闭连接。问题不在于下载响应。这是关于执行它。同样,这也是一个竞争条件——浏览器将打开新位置,这可能发生在它开始加载/执行响应体中的任何JS之前。我们可能会为此争论一整天,这听起来并不有趣。因此,为了尽可能清楚地说明这一点,问题是PHP代码是否总是在标题(“位置…”)之后执行。答案是肯定的。任何其他答案都是错误的。你的假设是错误的。浏览器不会在未获得响应正文的情况下终止连接。浏览器有合理的理由不自动重定向。看看这个例子,你有什么建议吗