这可能是一个太模糊的问题,但我已经解决了几个小时令人费解的服务器错误并将其归结为最奇怪的问题;在这一点上,我只想知道是否有人曾经发生过类似的事情,或者可能对可能发生的事情有任何见解。
以下代码行触发了错误:
if ($Name=='ProxiedIP') { return true; }
这个版本运行没有任何问题:
if ($Name=='proxiedIP') { return true; }
似乎令牌“ProxiedIP”以某种方式弄脏了一些东西,但我什至无法想到解析器将如何翻译字符串文字,从而使服务器像这样挂起。顺便说一句,我确定$Name!='proxiedIP'和$Name!='ProxiedIP'。
这是apache错误日志中的条目:
[Fri Jan 18 18:15:12.924419 2013] [core:error] [pid 27676:tid 3427232831232] [client 12.345.67.890:34482] Premature end of script headers: index.php, referer: http://mySite.com/
我搜索了“ProxiedIP”作为我系统上我能想到的每个组件的关键字,但我一无所获。不过,对我来说更重要的问题是字符串如何在比较检查中产生这种影响。有任何想法吗?
还值得注意的是,PHP 错误日志对此完全保持沉默。我在页面顶部启用了错误输出,但脚本从未完成加载,因此这可能是一个因素。这是我设置它的方式:
error_reporting(E_ALL);
ini_set('display_errors', 1);
因为代码在这里工作,它似乎更有可能是特定于平台实现的东西。我在 Gandi.net 的“简单托管”服务的实例上运行它,该服务运行 Varnish 以加速应用程序。值得一提的是,代码正在加载到单独域中的 iframe 中。
我也在对标头进行一些密集的工作,这似乎是问题的最大潜在根源,尽管就我而言奇怪的是触发错误的方式。此外,我知道没有一个名为“ProxiedIP”的通用标头,尽管到目前为止,使用冲突似乎是唯一有意义的事情。无论如何,我没有看到它。
对我来说,真正相关的仅仅是字符串比较导致服务器崩溃的事实。我已经用 PHP 编程超过 10 年了,以前从未发生过这样的事情。我试图了解它是如何发生的背后的后勤工作。
更新:我尝试了以下变体,它仍然产生相同的结果:
if ($Name === (strtoupper("p").'roxiedIP')) { return true; }
有人问我是否会发布完整的代码,但 iframe 端的脚本有 1400 多行,所以这并不可行。我正在调整有问题的部分以尝试在新脚本中运行它,并将发布结果。