几年前,我工作室的某个人设计了一个网页,现在客户决定更换服务器(他搬到了运行 Gen2 SMP、64 位、PHP 版本 5.3.8、标准 MYSQL 版本 5 的 Linux Apache 服务器)。它突然开始出现奇怪的事情。
当点击需要登录的链接时,页面会使用header()
PHP 中的函数将您重定向到登录页面。奇怪的是,该页面显示以下内容:
好的
服务器遇到内部错误或配置错误,无法完成您的请求。请联系服务器管理员 [未提供地址] 并告知他们错误发生的时间,以及可能导致错误的任何操作。有关此错误的更多信息可能在服务器错误日志中提供。HTTP/1.1 200 OK 日期:2012 年 10 月 15 日星期一 17:27:32 GMT 服务器:Apache/2.2.22 (Unix) FrontPage/5.0.2.2635 X-Powered-By:PHP/5.3.8 到期时间:1981 年 11 月 19 日星期四 08:52:00 GMT 缓存控制:no-store、no-cache、must-revalidate、post-check=0、pre-check=0 Pragma:no-cache Keep-Alive:timeout=5、max=399 连接:Keep-Alive Transfer-Encoding:chunked Content-Type:text/html 232c
然后是页面本身,然后是另一个标题:
0 1f4
好的
服务器遇到内部错误或配置错误,无法完成您的请求。请联系服务器管理员 [未提供地址] 并告知他们错误发生的时间以及可能导致错误的任何操作。有关此错误的更多信息可能在服务器错误日志中提供。0
最有趣的是,如果您刷新页面或在 URL 上按 Enter 键,它会正确加载。我一直在检查日志,它只归咎于不存在的图标。我还检查了 .htaccess,一切都正确(RewriteBase 是 /,正如预期的那样,唯一的内容是另一条规则将 ^en/ 请求移动到 request?lang=en。有人遇到过这样的事情吗?
编辑:IE 不会触发这两个标头。这越来越奇怪了。
解决方案!:正如@adaptr 指出的那样,这是 PHP 的问题,与服务器无关。最后一位程序员(我知道责怪前任不太礼貌,但这种情况花了我太多时间)做了以下事情:
/* config.php -> included everywhere as a bootstrap*/
// ... constant/mysql setup
if($notLogged)
{
$forward = ...;//previous url
header("Location: ".WWW.LANG."/customer-area/login/index.php?forward=".$forward);
exit;
}
经过深入研究后,我有些困惑:exit;
会正确发送标头吗?当然,删除该调用exit;
会继续执行页面(我知道这完全不正确,这就是我之前没有尝试的原因)。但是,如果标头没有完全发送,则可能会导致任何类型的问题(我不是服务器专家,我对此不确定,抱歉,朋友们)。删除该exit;
调用后,页面被正确形成,标头被“关闭”(由于输出开始),所有齿轮再次开始移动。谢谢大家,伙计们,悬赏 100 分 =)
答案1
如果 apache 日志没有显示任何错误,则意味着 PHP 处理了所有这些 - 并且还向客户端返回了奇怪的响应。
启用适当的 PHP 日志记录并调查其正在执行的操作。
响应中的这一部分具有指示性:
传输编码:分块
这意味着 PHP 以 (text/html) 流的形式发送响应,没有定义 Content-Size在标题中。
这可能会导致任何标头输出(PHP 经常缓存的内容,即无序生成)出现一点点失误,导致客户端认为正在发送新页面。
这只是一个可能的原因;正确的 PHP 日志记录将告诉您更多信息。
答案2
您需要调试页面代码,而不是查看服务器以找出原因。从您发布的内容中我可以看出它是使用 FrontPage 创建的(真的,专业人士用过它吗?),因此它不可避免地包含无法在非 Microsoft 平台上正常运行的代码。通过删除所有 Microsoft 特定代码来修复代码,它可能会正常运行。