【问题标题】:PHP redirect AFTER sending headers?发送标头后PHP重定向?
【发布时间】:2010-10-17 16:59:50
【问题描述】:

如果设置了变量等,我有一个需要重定向页面的函数...

问题是,这个函数在php页面的底部。

这意味着,我已经输出了很多信息,所以我收到了标题警告。

“警告 - 标头已由...发送”

标头发送后有什么方法可以重定向吗?

谢谢

【问题讨论】:

  • 这不是安全问题。你在 header() 之前做一个 print() 或者你有 <?php?><html> 标签的混合。

标签: php javascript html


【解决方案1】:

您应该将ob_start() 放在页面的开头,将ob_flush() 放在最后。这样您就不会遇到已经发送错误的标头。

请参阅those functions 以获取更多参考。

【讨论】:

  • 末尾的 ob_flush() 是隐含的,可以省略。这样做的好处是,如果您在应用程序的控制流中的某个函数调用不可见的地方在 ob_flush() 之后添加输出内容,您不会在几个月后意外地回到这个问题。
  • 这是 IMO 最干净的解决方案;请注意,这是通过缓冲标题和内容并仅在页面末尾将它们一起发送来实现的。
  • 也不是说取决于你的输出的大小和这个确切页面的访问次数,由于将所有字符串都存储到内存中,它确实可能会减慢你的页面。
  • 这也使得渐进式渲染变得不可能。但是我们都在使用的 gzip 也是如此,对吧?对?比勒?
  • @eyelidlessness:您可以尝试在这里和那里刷新缓冲区。例如在 HTML 头部之后。如果数据量不够,大多数浏览器将不会呈现任何内容,所以......是的。 :)
【解决方案2】:

有办法,但基本上都是变通方法:

最简单的是meta http-equiv

<meta http-equiv="Refresh" content="0;http://www.example.com/newlocation">
  • 某些浏览器在&lt;head&gt; 元素之外时不喜欢这样,并进入怪癖模式

或者,您可以尝试 JavaScript 重定向:

<script>
    window.location = 'http://www.example.com/newlocation';
</script>
  • 如果没有 JavaScript,这显然是行不通的。

【讨论】:

  • http-equiv 标头必须在文档的前几百字节内,否则浏览器不会将它们视为 HTTP 标头。
  • @eyelidlessness:有趣,我不知道。 [需要引用]?
  • @Piskvor,它可能只是一个遗留问题。我很难挖东西。但我确实记得那天微软文档特别警告开发人员将与 HTTP 等效的元标记放在前 N 个字节中,否则它们不会被视为标头。
  • 我会使用 jscript 重定向,甚至更好的是进行干净的重构,以便在所有业务逻辑处理完每个数据并做出所有决策之后进行输出,以便在任何输出之前可以进行重定向,或者如果由于数据处理时间长而需要进行一些输出,则可以重构它,以便在任何输出完成之前准备好所需的计算。
  • @eyelidlessness 好吧,如果微软这么说,那可能只适用于 IE,如果他们很久以前说过,它仍然应该是相关的,因为 IE 开发团队向 W3C 标准的变化不知何故进展缓慢 >
猜你喜欢
  • 2016-07-03
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多