我需要在header("Location: http://localhost/...");之后使用exit吗?

16

我正在创建一个表单验证脚本,我想问一个问题。 当我使用头信息(如下面的示例)时,我需要立即使用exit吗?我的意思是,使用header也意味着默认情况下它正在退出,因此我不需要使用exit命令吗?

// cancel button clicked
if (isset($_POST['cancel'])) {
  header("Location: http://localhost/admin/tracks.php");
  exit;
}

echo '<p>$name</p>'

我觉得你不需要这样做。当头部信息发送后,你会被重定向并且脚本的执行会停止。 - emco
3
并不完全正确。请参考我的回答中的例子。 - AgentConundrum
可能是[为什么我在PHP中通过header('Location..')重定向后必须调用'exit'?]的重复问题(https://dev59.com/RXE85IYBdhLWcg3wgDpI)。 - kapa
6个回答

24

你应该调用exit(),因为header()不会自动停止脚本的执行 - 或者即使它这样做(老实说我也不100%确定),它肯定不会立即停止脚本。

例如,尝试运行以下代码:

<?php

  header("Location: http://www.google.com");
  unlink(__FILE__);

?>

这个小脚本使用header()将你重定向到谷歌,然后删除自己。如果你运行它,你会注意到在重定向后,文件仍然被删除了。这意味着尽管header()调用了重定向,unlink()调用仍然执行了。


我也有同样的担忧,它确实会继续执行!最好退出; - TimNguyenBSM

7
我在header->location调用之后使用exit,因为我希望能够绝对信赖脚本不会越过header->location调用。
如果有错误并且您的脚本在header->location调用之前开始生成输出,则调用将失败,并且脚本执行将正常继续(除非您调用exit)。

1
关于调用失败的观点很好。我甚至没有考虑过这种可能性。 - AgentConundrum
您的错误示例不相关。脚本继续执行无需错误。 - Your Common Sense
@Shad:实际上是可以的。请看我的答案中的示例。你的第一个“Location”头部甚至不需要是你发送的第一个。你可以设置一个 Location 头部,进行一些处理,然后发送另一个,用户将被重定向到您指定的最后一个 Location。 - AgentConundrum
@Shad 哦,真的吗?有什么原因吗? - Your Common Sense
@Col. Shrapnel:我想你指的是双重定位标头吧?如果是这样,你说得对。只有在发送标头之前才能替换标头。如果你没有任何输出缓冲区,进行location->echo->location操作,那么第一个location将被使用,因为Location标头以及所有其他标头都会在回显内容发送之前自动发送。假设第二个也会抛出“标头已经发送”错误,但由于浏览器已经重定向离开了您的页面,所以没有人会看到它。 - AgentConundrum
显示剩余3条评论

1

虽然上面的答案听起来很棒,但如果您不确定代码路径,这可能会导致意外结果。例如,如果您正在使用依赖于代码执行将从头到尾运行的框架,则可能会无意中中断它。

从用户角度来看,这可能是可以接受的,因为他们仍将被重定向,并且不会有任何问题,但请考虑以下内容:

您正在使用期望记录重定向或设置其他标头(或任何其他项目)的框架(操作系统或自定义)。通过调用exit,您正在绕过该逻辑,因此可能会获得意外结果。

因此,简而言之,是的,上述方法将起作用,只是要注意在短路之前知道您希望发生什么。


0

它不会停止您的脚本运行,您的脚本将继续运行,有时候一个人(可能是出于恶意)只需要让您的脚本达到某个特定点,他就可以执行X操作。Header()只会重定向,而exit();则会立即停止脚本(在exit();处)。或者像其他人在用户名下所述:

Cody. A. Ray:是的,如果您不明确终止它,则调用header('Location: http://google.com')后脚本将继续处理!我刚在本地尝试了一下。我在Apache网站中添加了test.php,并添加了以下内容。

<?php

 header('Location: http://google.com');
 error_log("WE MADE IT HERE SOMEHOW");

?>

并检查了我的 /var/log/apache2/error_log,寻找这个条目:

 [Tue Feb 12 23:39:23 2013] [error] [client 127.0.0.1] WE MADE IT HERE SOMEHOW

所以最终结论是:头部不会阻止脚本运行。

0

如果像这样重定向,通常不会发送输出(取决于输出缓冲等),但是如unlink()示例所示,脚本不会因header()而死亡。

因此,如果您想要在重定向后阻止脚本继续运行,则需要使用exit()或die()调用。


-2
使用头文件是否意味着默认退出?
怎么会呢? 如果您的头文件不是“Location:”,而是“Content-type:”或“Cache-control”或其他任何内容,那该怎么办?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接