【问题标题】:PHP Header("Location:...") works on one computer and not anotherPHP Header("Location:...") 适用于一台计算机而不是另一台计算机
【发布时间】:2010-08-09 15:59:52
【问题描述】:

所以当我部署一些我认为我已经测试过的代码时,我得到了一个令人讨厌的惊喜。看来我的测试机和我的服务器之间肯定存在一些差异。完全相同的代码,具有标头重定向,在我的测试机器上完美运行,而不是在服务器上。服务器上的重定向根本没有发生,结果留下了一个空白页面。

头文件在脚本中间的某个地方被调用 - 但还没有输出任何内容。在脚本结束之前它不会输出任何内容。在其他一切都运行之后很久。它缓冲一切。

服务器和测试机都运行相同的 PhP 版本,相同的 Apache 版本。配置文件中是否有某些内容允许标题发生在一个而不是另一个?这里是否还有其他事情会导致它失败?

编辑:

这是设置标题的行:

public function setRedirect($url) {
    header('Location: '.$url);
}

下面是调用它的代码:

$url = new URL('index');
$this->layout->setRedirect($url->toString());

其中URL::toString() 始终生成完全限定域名,在本例中为:http://domain/index.php?action=index

我检查了 Php 和 Apache 错误日志。纳达。

【问题讨论】:

  • 您是否正在重定向到绝对(完全限定)URL?
  • 为了完整起见:您能否包括有 header() 调用的行?
  • @Peter Bailey @Tomalak 完成(是)并完成。查看修改。

标签: php configuration redirect header apache2


【解决方案1】:

header 调用之前可能有一些空格或其他形式的输出。

这仅在您启用了 ini 设置 output-buffering 时才有效(或者如果您明确启动输出缓冲,但在这种情况下,重定向应该在两台计算机上都有效)。

您可以通过打开错误报告来确认这一点。

【讨论】:

  • 如果是这样,为什么它会在测试机器上运行而不是在服务器上运行?输出和脚本是相同的。此外,错误报告没有显示任何内容。
  • @Daniel 因为服务器可能打开了输出缓冲而关闭了测试机器。
  • 太棒了!对不起,我第一次误解了你的答案,现在我明白了。确实是测试服务器打开了 output_buffering 而服务器关闭了它的情况。让我们看看这是否能解决它...
  • 美丽 :) 它就像一个魅力。哇,与那个人打得很好,一百万年后我永远不会发现它。仍然有点好奇为什么错误从未出现,但正如他们在泰国所说的那样 - mai bpen rai。谢谢!
【解决方案2】:

使用 Fiddler 或其他一些客户端工具来检查您的标头。确定 Location: 标头实际上正在发送。此外,某些浏览器对标头需要发送的顺序很挑剔。

【讨论】:

    【解决方案3】:

    我认为最可能的解释是错误导致脚本在您的服务器上退出,并且您关闭了显示错误(因此出现空白屏幕)。我建议在你的服务器上检查 Apache 错误,看看 PHP 是否在里面放了一些东西。

    否则,您可以使用 LiveHTTPHeaders(用于 Firefox)之类的浏览器扩展程序来查看是否发送了位置标头,或者尝试调试脚本以查看它是否甚至到达了该标头调用。

    【讨论】:

      【解决方案4】:

      我认为您的服务器在您的页面中放置了一些脚本来跟踪访问者并为您提供流量统计信息或用于类似目的。理想情况下,您应该得到一个错误,但可能是您的服务器禁用了错误报告,这会给您一个空白页面。

      我建议您运行一个出现语法错误的脚本并检查您的服务器是否禁用了错误报告。

      【讨论】:

        猜你喜欢
        • 2020-09-08
        • 1970-01-01
        • 1970-01-01
        • 2018-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-16
        • 1970-01-01
        相关资源
        最近更新 更多