5

我用 PHP 编写了一个使用 Ajax 请求的 Web 应用程序(使用 YUI.util.Connect.asyncRequest 制作)。

大多数情况下,这工作正常。该请求使用XMLHttpRequest的X-Requested-With值发送。我的 PHP 控制器代码使用 apache_request_headers() 检查传入的请求是否是 Ajax 并且一切正常。

但不总是。间歇性地,我遇到了发送 Ajax 请求的情况(Firebug 向我确认请求的标头包含 XMLHttpRequest 的 X-Requested-With),但 apache_request_headers() 没有在其列表中返回该标头。

当我 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)

但萤火虫告诉我:

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

在执行相同的代码时,这种不匹配(显然)是间歇性的。但在软件方面,我不相信“间歇性”!帮助!

4

4 回答 4

7

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

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

在您的情况下,您可以在以下方面找到您的必要价值:

$_SERVER['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'

于 2008-10-30T13:57:22.410 回答
1

对于那些遇到这个问题的人的未来参考,“间歇性”可能是由于重定向发生在服务器端。如果发生 302 重定向,则不会传递 X-Requested-With 标头,即使它是在原始请求中发送的。这可能是问题的最初原因。

于 2010-03-24T17:19:51.197 回答
0

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

附带说明一下,X-Requested-With 标准了吗?我已经阅读了有关添加它的各种库,但我不知道它已成为标准。

于 2008-10-30T13:54:28.343 回答
0

我无法具体回答这种情况,但总的来说,我建议使用(查询)参数来表示 xmlhttp 请求,而不是标头。您永远不知道有什么有趣的安全或代理服务器会自行处理 HTTP 标头,或缓存应该是纯浏览器 HTML 响应的 AJAX 响应(反之亦然)。

于 2008-10-30T14:11:10.730 回答