我需要在标题后使用exit(“Location:http:// localhost / ...”);?

时间:2011-04-03 05:49:03

标签: php validation

我正在创建一个验证表单的脚本,我问自己一个问题。当我使用标题(参见下面的示例)时,我是否需要在之后使用退出?我的意思是,使用标题也意味着它默认退出,因此我不需要使用命令exit?

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

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

6 个答案:

答案 0 :(得分:23)

你应该调用exit(),因为header()不会自动停止脚本执行 - 或者如果它(我老实说不是100%),它绝对不会停止剧本即刻。

例如,请尝试以下代码:

<?php

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

?>

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

答案 1 :(得分:7)

我在header-&gt;位置调用之后使用exit因为我希望能够绝对依赖脚本不会超过header-&gt;位置调用这一事实。

如果某个地方出现了错误并且您的脚本在header-&gt;位置调用之前开始生成输出,则调用将失败,并且脚本执行将继续正常(除非您调用exit)

答案 2 :(得分:1)

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

从用户的角度来看,这可能没问题,因为它们仍然会被重定向,并且不会更明智,但请考虑以下因素:

您正在使用期望记录重定向的框架(操作系统或自定义),或设置其他标头(或任意数量的其他项)。通过调用exit,你可以绕过这种逻辑,因此可能会得到意想不到的结果。

所以简而言之,是的,上述方法是有效的,只需要谨慎一点,知道在短路之前你会发生什么。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

它不会阻止你的脚本运行,你的脚本会继续运行,有时候所有人(可能有不良意图)需要你的脚本到达他可以做X的特定点.Header()将只是redirect,exit();但是会立即停止脚本(exit(); is)。或者用其他人在用户名下说明:

科迪。 A. Ray:是的,如果你没有明确地终止它,脚本会在调用标题(&#39;位置:http://google.com&#39;)之后继续处理!我刚在当地尝试过。我将test.php添加到apache中包含这些内容的站点

<?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

所以最终结论:标题不会阻止脚本运行。

答案 5 :(得分:-1)

  

使用标题也意味着它默认退出

怎么样? 如果您的标题不是Location:,而是Content-type:Cache-control或其他什么,该怎么办?