PHP 标头位置在 HTML 中间工作

Posted

技术标签:

【中文标题】PHP 标头位置在 HTML 中间工作【英文标题】:PHP header Location works in the middle of HTML 【发布时间】:2011-03-03 12:08:43 【问题描述】:

我无法理解 header("Location: http://www.google.com/"); 如何在 html 页面的 <body> 中间工作。 由于 HTML 输出,在<?php ... ?> 部分开始之前已经发送了标头,因此不应该出现错误。

我指的是我期望得到的警告Cannot modify header information - headers already sent by...

我正在本地 PHP 开发环境 (Apache/2.2.15 (Win32) PHP/5.3.2) 上对此进行测试。

这是一个例子:

<html>
<head>
</head>
<body>
<?php header("Location: http://www.google.com/"); ?>
</body>
</html>

有什么想法吗?谢谢。

【问题讨论】:

有效吗?它会将您发送到 google.com 吗? 是的,因为启用了输出缓冲,请参阅下面的答案。 【参考方案1】:

因为output buffering...

【讨论】:

【参考方案2】:

如果您在 php.ini 中自动启用了输出缓冲,那么您可以在实际发送输出之前的任何时间发出标头。

【讨论】:

+1,这可能是问题所在 - php.net/manual/en/outcontrol.configuration.php 这是一件好事吗?我应该让它保持启用吗?能够在 HTML 正文中使用 PHP 脚本而不是在文档顶部 (IMO) 使用 PHP 脚本来进行转发实际上非常方便。这是推荐的吗?谢谢。 它将阻止诸如增量更新之类的事情。我自己更喜欢在脚本中手动打开它,而不是希望它已在我的脚本部署到的服务器的配置中启用。 好的,我想我也会在我的脚本中启用它。这会保证输出缓冲将真正起作用,还是某些服务器设置可能会阻止它正常工作?另外,请告诉我在我的脚本中手动打开它的最佳方法是什么。 如果您在脚本中明确启用它,则服务器配置无法禁用它。 ob_start() 启用它,ob_end_flush() 用于将缓冲区发送给客户端。【参考方案3】:

如果您启用了输出缓冲(请参阅ob_start()),则在整个页面完成之前不会发送任何输出。

【讨论】:

【参考方案4】:

我最近在 Windows 上使用 WAMP 包进行一些开发时注意到了这一点。当我转向在 Linux 机器上运行它时,引起了很多麻烦。我相信有一个配置值集导致它缓冲所有页面。

【讨论】:

以上是关于PHP 标头位置在 HTML 中间工作的主要内容,如果未能解决你的问题,请参考以下文章

PHP标头404不起作用

IFRAME 中的 PHP“标头(位置)”,加载到 _top 位置?

php 自定义接受标头中间件

即使在提供静态文件时,仍然设置使用 PHP 设置的 HTTP 标头

php 自定义接受标头的中间件内核

标头位置相对路径兼容性