【问题标题】:do I need to use exit after header("Location: http://localhost/...");?我需要在 header("Location: http://localhost/..."); 之后使用 exit 吗?
【发布时间】:2011-04-03 05:49:03
【问题描述】:

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

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

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

【问题讨论】:

标签: php validation


【解决方案1】:

您应该调用exit(),因为header() 不会自动停止脚本的执行 - 或者如果确实如此(我真的不是 100% 对此),它绝对不会立即停止脚本。

例如,试试这个代码:

<?php

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

?>

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

【讨论】:

  • 我也有同样的担忧,它确实会继续执行!最好退出;
【解决方案2】:

我在 header->location 调用之后使用exit,因为我希望能够完全依赖脚本不会通过 header->location 调用这一事实。

如果某处存在错误并且您的脚本在 header->location 调用之前开始生成输出,则调用将失败,并且脚本将继续正常执行(除非您调用 exit)

【讨论】:

  • 关于通话失败的要点。我什至没有考虑过这种可能性。
  • 您的错误示例无关紧要。脚本继续不需要任何错误
  • @Shrapnel 我没有说一个是必需的,我提供了一个例子。在成功的 header->location 调用之后,脚本执行正常继续
  • @Shad:实际上,确实如此。请参阅我的答案以获取示例。您的第一个“位置”标头甚至不需要是您发送的第一个标头。您可以设置一个 Location 标头,进行一些处理,然后再发送一个,用户将被重定向到您指定的最后一个 Location。
  • @Shad 哦,真的吗?有什么理由吗?
【解决方案3】:

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

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

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

所以简而言之,是的,上述方法都行得通,只是在短路之前知道你期望发生什么。

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      它不会阻止你的脚本运行,你的脚本会继续运行,有时一个人(可能是出于恶意)需要你的脚本达到他可以执行 X 的某个点。 Header() 只会重定向,退出();但是会当场停止脚本(exit(); 在哪里)。或其他人在用户名下所述:

      科迪。 A. Ray:是的,脚本在调用 header('Location: http://google.com') 后继续处理,如果你没有明确终止它!我只是在本地尝试过。我使用这些内容将 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
      

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

      【讨论】:

        【解决方案6】:

        使用header也意味着默认退出

        怎么会? 如果您的标头不是Location: 一个,而是Content-type:Cache-control 或其他什么?

        【讨论】:

          猜你喜欢
          • 2014-07-22
          • 2023-03-09
          • 2011-04-02
          • 1970-01-01
          • 1970-01-01
          • 2011-02-14
          相关资源
          最近更新 更多