我用PHP编写了一个Web应用程序,它使用了Ajax请求(使用YUI.util.Connect.asyncRequest进行)。

大部分时间,这都很好。该请求的发送带有 X-Requested-With XMLHttpRequest 。我的PHP控制器代码使用apache_request_headers()来检查传入的请求是否是Ajax,并且一切正常。

但并非总是如此。间歇性地,我遇到了发送Ajax请求的情况(并且Firebug确认请求中的标头包含XML-HttpRequest的X-Requested-With)但是apache_request_headers()没有在其列表中返回该标头。 / p>

我在var_dump apache_request_headers()时的输出如下(注意缺少X -

'Host' => string 'peterh.labs.example.com' (length=26)
'User-Agent' => string 'Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.3) Gecko/2008101315 Ubuntu/8.10 (intrepid) Firefox/3.0.3' (length=105)
'Accept' => string 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' (length=63)
'Accept-Language' => string 'en-gb,en;q=0.5' (length=14)
'Accept-Encoding' => string 'gzip,deflate' (length=12)
'Accept-Charset' => string 'ISO-8859-1,utf-8;q=0.7,*;q=0.7' (length=30)
'Keep-Alive' => string '300' (length=3)
'Connection' => string 'keep-alive' (length=10)
'Referer' => string 'http://peterh.labs.example.com/qmail/' (length=40)
'Cookie' => string 'WORKFLOW_SESSION=55f9aff2051746851de453c1f776ad10745354f6' (length=57)
'Pragma' => string 'no-cache' (length=8)
'Cache-Control' => string 'no-cache' (length=8)

但是Firebug告诉我:

Request Headers:
Host             peterh.labs.example.com
User-Agent       Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.3) Gecko/2008101315 Ubuntu/8.10 (intrepid) Firefox/3.0.3
Accept           text/html,application/xhtml+xml,application/xml;q=0.9,**;q=0.8
Accept-Language  en-gb,en;q=0.5
Accept-Encoding  gzip,deflate
Accept-Charset   ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive       300
Connection       keep-alive
X-Requested-With XMLHttpRequest
Referer          http://peterh.labs.example.com/qmail/
Cookie           WORKFLOW_SESSION=55f9aff2051746851de453c1f776ad10745354f6

执行相同代码时,这种不匹配(显然)是间歇性的。但我不相信“间歇性”的说到软件!救命啊!

有帮助吗?

解决方案

我不确定为什么apache_request_headers()和firebug不匹配,但为了读取请求标头,你可以使用$ _SERVER超级全局

客户端发送的每个标头(无论客户端如何)都将到达$ SERVER数组。 该标题的关键是HTTP 前缀,所有字母大写和短划线都转换为下划线(_)

在您的情况下,您可以在以下位置找到所需的价值:

$ _ SERVER ['HTTP_X_REQUESTED_WITH'] ='XMLHttpRequest'

其他提示

为了将来参考这个问题的人,“间歇性的”可能是由于服务器端发生了重定向。如果发生302重定向,则即使已在原始请求中发送了X-Requested-With标头,也不会传递该标头。这可能是问题的原因。

仔细检查缺少的标头是否不在超全局 $ _ SERVER 中。一般来说,如果我真的需要,我不会依赖apache_ *。

另一方面,是X-Requested - 标准了吗?我已经阅读过添加它的各种库,但我不知道它已经成为标准了。

我无法具体回答这种情况,但一般情况下我建议使用(查询)参数来发信号通知xmlhttp请求,而不是标头。你永远不知道有什么好玩的安全或代理服务器可以自行调整HTTP标头,或者缓存一个应该是普通浏览器HTML响应的AJAX响应(反之亦然)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top