php - 我应该在调用 Location: 标头后调用 exit() 吗?

Posted

技术标签:

【中文标题】php - 我应该在调用 Location: 标头后调用 exit() 吗?【英文标题】:php - Should I call exit() after calling Location: header? 【发布时间】:2011-04-02 23:51:08 【问题描述】:

调用重定向函数头后,是否应该调用exit?

<?php // fileA
$urlFailToGoTo = '/formerror.php';

if (sth)

   header(sprintf("Location: %s", $urlFailToGoTo));
   exit(); //should I call exit() here? or return?


?>

谢谢

【问题讨论】:

Why I have to call 'exit' after redirection through header('Location..') in PHP?的可能重复 【参考方案1】:

你绝对应该。否则脚本执行不会终止。单独设置另一个标头不足以重定向。

【讨论】:

您好 Oliver,exit 是否终止了 formerror.php 中脚本的执行?我想我的问题是当我在“标题”之后调用“退出”时。哪个脚本受到影响,将不再执行?谢谢 exit 总是中断当前脚本(在您的情况下为“fileA”)。您重定向到的页面(“/formerror.php”)完全不受影响。重定向告诉您的浏览器向您在“位置”中指定的位置发起新的 HTTP 请求。基本上和手动点击“formerror.php”的链接一样。 所以exit基本上只针对服务端,不会再做不必要的工作了?【参考方案2】:

就像@rgroli 解释的那样,您应该这样做。如果不想打扰括号,也可以拨打header()INexit():

if(sth) exit(header("Location: http://example.com"));

HTTP/1.1 中的位置标头始终需要绝对路径 see the note here。

注意:这不是 hack,因为 exit code 仅在参数为整数时使用,而 header() 产生 void(它以 code=0 退出,正常退出)。将其视为exit_header() 函数,就像它应该在Location 标头之后一样。

【讨论】:

我想你的意思是 header IN exit()? ;) 这是否意味着您将header 的输出作为exit 的退出代码传递?这不是有点不受欢迎吗? @ADTC header() 在 PHP 中返回 void 并且仅当参数为整数时才使用退出代码。在这种情况下,它只是默默地停止代码生成(意味着退出代码=0,正常退出)。【参考方案3】:

在发送Location: 标头后,exit;(注意 - 这是一个关键字,因此您不需要 ())通常是一种很好的做法,因为浏览器应该重定向到新页面等等当前脚本的执行通常是不受欢迎的。

【讨论】:

【参考方案4】:

如果标题下没有任何代码(PHP 或 html),则不必。

【讨论】:

你好aromawebdesign.com,我在formerror.php中有代码。那是问题吗?谢谢 如果你在调用 header 后确实有任何类型的代码,你应该调用 die();或退出();【参考方案5】:

exit 是错误的编码。

如果您曾经开发过一个大型项目并想要创建 PHP 单元测试用例,那么 exit 将把您搞砸。

exit 终止脚本和您正在运行的测试!没有办法恢复测试并判断它是否失败......

以这样的方式组织你的代码,如果你使用重定向,没有输出并且脚本自然结束......

【讨论】:

我认为如果测试软件不能对正在测试的脚本进行沙箱化,那就是测试软件的失败。这就像一台计算机因为使用 exit 命令终止的 shell 脚本而关闭。 不,终止任何事物之间的任何事物都是错误的。编程背后有一个堆栈。一切以函数调用开始,以函数调用结束。 我不知道你在说什么:/ @Umingo 这不是exit 调用(或者break,在函数/方法中)的真正目的吗?不仅在 PHP 中,而且在几乎所有知名的编程语言中? @Umingo 您能否发布任何来源或示例?您只是再次回复同一件事,这看起来更像是一种观点,而不是编程事实。

以上是关于php - 我应该在调用 Location: 标头后调用 exit() 吗?的主要内容,如果未能解决你的问题,请参考以下文章

PHP AJAX 12017 调用标头(位置:)时出错 [重复]

PHP 标头位置在 HTML 中间工作

基于 header(location) 命令重定向 php 页面不起作用;标头已发送错误[重复]

在“Location:”标头中使用协议相关的 URI

Apache 的带有 PHP 标头的 mod_proxy_html("Location:...");不重定向

没有 Location 标头的 301 http 响应