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

jtr*_*ick 6 php string http-headers self-reference

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

以下代码行触发错误:

if ($Name=='ProxiedIP') { return true; }
Run Code Online (Sandbox Code Playgroud)

这个版本运行没有任何问题:

if ($Name=='proxiedIP') { return true; } 
Run Code Online (Sandbox Code Playgroud)

似乎某种方式令牌'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/
Run Code Online (Sandbox Code Playgroud)

我搜索了'ProxiedIP'作为我能在系统中思考的每个组件的关键字,我什么也没想到.对我来说更迫切的问题是,字符串如何在比较检查中以某种方式产生这种影响.有任何想法吗?


另外值得注意的是PHP错误日志完全没有提及.我正在页面顶部启用错误输出,但脚本永远不会完成加载,因此这可能是一个因素.这是我设置它的方式:

error_reporting(E_ALL);
ini_set('display_errors', 1);
Run Code Online (Sandbox Code Playgroud)

因为代码在这里起作用,所以它似乎更有可能是平台实现特有的东西.我在Gandi.net的"Simple Hosting"服务实例上运行它,该服务运行Varnish以进行应用程序加速.值得一提的是,代码是在单独的域中的iframe中加载的.

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

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


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

if ($Name === (strtoupper("p").'roxiedIP')) { return true; }
Run Code Online (Sandbox Code Playgroud)

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

jtr*_*ick 1

感谢您的帖子,但事实证明这是一个非常复杂的场景,功能链下游几个级别的条件导致了超出相关功能范围的意外行为。

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

我最初发帖是因为我对真正似乎是字符串文字比较做一些我认为不可能的事情感到困惑,并且想了解如果是这样,什么条件可以允许它发生。我很高兴原因实际上并不像看上去的那样。感谢您帮助解决难题。


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

PHP传统上在管理自引用实体方面存在问题,尽管已经做出了改进,但我的特殊情况非常复杂,足以在尝试映射这些对象时将ReflectionClass发送到无限循环中。我已经通过在轮询项目时手动取消引用项目来修复它,但如果需要在公共数组或引用结构中使用多个 $GLOBALS 相关的变量,则需要注意这一点。