我收到一些报告,有人在浏览器中看到原始 html(而不是浏览器解释它)。这似乎是在连接速度较慢的情况下发生的。当发生这种情况时,如果用户重新加载页面,页面将被正确解释。是否有任何服务器特定的东西会导致这种情况发生?我们使用的是 Php 5.1.6 和 Apache 2.2.3。
答案1
我立即想到了两种可能的情况:
如果您所说的“原始 html”是指“已解释但未设置样式”,那么这种情况最常发生在严格使用 CSS 进行所有样式设计的页面上,因为样式表仅在 html 加载后才会下载。您可能想要尝试在 html 头部部分内嵌一些非常基本的样式,这至少意味着在下载剩余的样式表代码之前,页面看起来是“可接受的”。如果样式表在第一次加载时从未真正到达客户端,即使耐心等待,那么您可能需要增加连接超时,这可能会阻止下载所有文件以正确显示页面。
通过“原始 html”,您实际上是指“未经解释、未加样式且带有 !DOCTYPE 和 html 标签的纯文本”,那么它可能是我上面描述的更为严重的情况,或者您的 PHP 脚本可能设置为在 html 完全生成之前将响应缓冲区刷新到客户端(但是,即使在这种情况下,大多数浏览器仍会做出合理的尝试来解释 HTML)。
我会好好考虑一下,如果在别人想出更具体的东西之前想到了更多的想法,我会相应地更新我的答案
答案2
我使用 PHP 的 Drupal 时,经常遇到出现这种问题的原因是,在输出中写入<!DOCTYPE html>
或之前,错误消息就出现了,而且输出得非常早<html>
。然后,浏览器可能会将输出解释为纯文本,因为它在文档开头没有看到带有 X 个字符的标签。(它通常会愉快地跳过一定量的数据,我见过一个 RSS 提要,它以看起来像 2 个随机字节开头,第一个字节甚至可能是零,而 Firefox 仍然很开心,它会忽略这些字节!)
避免此问题(假设这是问题所在)的一个解决方案是确保您的生产环境不会将 PHP 错误打印到输出缓冲区。php.ini 中有设置 - 虽然知道这些可以在 PHP 代码中覆盖:
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);