2010-08-09 170 views
0

因此,当我部署了一些我认为已经测试过的代码时,我感到非常吃惊。看起来我的测试机器和我的服务器之间肯定有一些区别。具有标题重定向的完全相同的代码在我的测试机器上完美工作,并且完全不在服务器上。服务器上的重定向根本没有发生,结果留下空白页面。PHP标题(“位置:...”)在一台计算机上运行,​​而不是在另一台计算机上运行

头文件在脚本中间的某处被调用 - 但是没有输出。它不会输出任何东西,直到脚本的最后。在一切运行之后很久。它缓冲一切。

服务器和测试机器都运行相同的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错误日志。纳达。

+1

您是否重定向到绝对(完全限定)的URL? – 2010-08-09 16:01:29

+1

只是为了完整:您可以包含具有“header()”调用的行吗? – Tomalak 2010-08-09 16:02:18

+0

@Peter Bailey @Tomalak完成(是)并完成。查看修改。 – 2010-08-09 16:18:37

回答

3

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

只有当您设置了ini设置output-buffering(或者如果您明确开始输出缓冲,但在这种情况下,重定向应该在两台计算机上都能正常工作),这才起作用。

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

+0

如果是这种情况,为什么它可以在测试机器上运行,而不是在服务器上运行?输出和脚本是相同的。另外,错误报告什么也没有显示 – 2010-08-09 16:19:24

+0

@Daniel因为服务器可能会打开输出缓冲并关闭测试机。 – Artefacto 2010-08-09 16:20:50

+0

太棒了!对不起,我第一次误解了你的答案,现在我明白了。事实上,测试服务器的output_buffering处于打开状态,并且服务器关闭了它。让我们看看这是否修复它... – 2010-08-09 16:29:05

0

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

0

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

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

0

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

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

相关问题