PHP:if($ Name =='ProxiedIP')导致500(内部服务器错误)

时间:2013-01-18 23:54:52

标签: php string http-headers self-reference

这可能过于模糊了一个问题,但我一直在排除令人困惑的服务器错误数小时,并将其归结为最奇怪的问题;在这一点上,我只是想知道是否有人发生了类似的事情,或者可能对可能发生的事情有所了解。

以下代码行触发错误:

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);

因为代码工作here,所以它似乎更有可能是平台实现的特定内容。我在Gandi.net的“Simple Hosting”服务实例上运行它,该服务运行Varnish以进行应用程序加速。值得一提的是,代码是在单独的域中的iframe中加载的。

我也在使用标题进行一些密集的工作,这似乎是问题的最大潜在来源,尽管就我所关注的奇怪的是错误被触发的方式。此外,我所知道的没有常见的标题称为“ProxiedIP”,尽管使用冲突是迄今为止唯一似乎有意义的事情。无论如何,我没有看到它。

对我而言,真正相关的项目仅仅是字符串比较会使服务器崩溃。我已经用PHP编程超过10年了,我从来没有遇到过类似的事情。我正在努力了解它背后的物流方式。


更新:我尝试了以下变体,它仍会产生相同的结果:

if ($Name === (strtoupper("p").'roxiedIP')) { return true; }

有人问我是否会发布完整代码,但iframe端的脚本长度超过1400行,所以这不太可行。我正在调整有问题的片段以尝试在新脚本中运行它并将发布结果。

4 个答案:

答案 0 :(得分:2)

我认为问题在于变量$ Name。检查是否正确分配。还要检查导致问题的if语句之后的代码。

答案 1 :(得分:1)

实际上,我认为你的问题在于调用函数,即根据返回值它会做一些“愚蠢”和PHP崩溃。 尝试用硬return truereturn false替换if(),看看会发生什么。

答案 2 :(得分:1)

当我从你的错误中得到结论时,你正在弄乱框架,如果你的框架在fw被允许输出之前触发了一些输出,那么这个改变就是这样。只是更详细地阅读它,你在错误的列车上得到它,这不是错误的原因,它是fw的非空状态的开始。

尝试在php调试器中运行脚本,而不是使用var dump。

答案 3 :(得分:1)

感谢这些帖子,但事实证明这是一个非常复杂的场景,在这个场景中,条件下几个级别的条件导致了任何一个函数范围之外的意外行为。

实际问题是由于在一个完全独立的进程中解析debug_backtrace()数组的输出时的条件检查,具有讽刺意味的是防止无限递归,而是触发了一个类似的破坏性事件级联记忆限制。

我最初发布的原因是因为我感到困惑的是真正看起来像字符串文字的比较做了一些我认为不应该做的事情,并想知道如果有的话会有什么条件允许它发生。我很高兴原因实际上并不是它的样子。感谢您帮助解决难题。


更新:错误的真正来源取决于PHP难以翻译包含对自身的引用的对象或数组。我正在存储转换的标头,直接标头引用,$ _REQUEST []和$ _SERVER []项,以及在复杂的关联数组中记录消息和相关数据。这些项之间有很多动态引用,特别是涉及我使用的本机PHP全局变量的那些。

PHP traditionallyproblems管理自引用实体,虽然已经进行了改进,但我的特殊情况非常复杂,足以在尝试映射时将ReflectionClass发送到无限循环中这些对象。我已经通过手动dereferencing修复了它,因为我正在轮询它们,但如果需要在公共数组或引用结构中使用多个与$ GLOBALS相关的变量,则需要注意这一点。