PHP apache_request_headers() не соответствует действительности (подтверждено Firebug): почему?

Я написал веб-приложение на PHP, которое использует запросы Ajax (сделанные с использованием YUI.util.Connect.asyncRequest).

В большинстве случаев это работает нормально. Запрос отправляется со значением X-Requested-With XMLHttpRequest. Мой код контроллера PHP использует apache_request_headers() для проверки того, является ли входящий запрос Ajax или нет, и все работает хорошо.

Но не всегда. Время от времени я получаю ситуацию, когда запрос Ajax отправляется (и Firebug подтверждает для меня, что заголовки запроса включают X-Requested-With из XMLHttpRequest), но 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)

Но 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

Это несоответствие (очевидно) прерывистое при выполнении одного и того же кода. Но я не верю в «прерывистость», когда дело касается программного обеспечения! Помощь!


person Peter Howe    schedule 30.10.2008    source источник


Ответы (4)


Я не уверен, почему несоответствие apache_request_headers() и firebug, но для чтения заголовков запросов вы можете использовать суперглобальный $_SERVER

каждый заголовок, отправляемый клиентом (и неважно, каким он является), будет поступать в массив $SERVER. Ключ этого заголовка будет с префиксом HTTP, все заглавные буквы и тире преобразуются в подчеркивание (_).

в вашем случае вы можете найти необходимое значение в:

$_SERVER['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'

person user27987    schedule 30.10.2008

Для справки в будущем тех, кто сталкивается с этим вопросом, «прерывистое» может быть связано с перенаправлением, происходящим на стороне сервера. Если происходит перенаправление 302, заголовок X-Requested-With не передается, даже если он был отправлен в исходном запросе. Это могло быть первоначальной причиной проблемы.

person pnomolos    schedule 24.03.2010

Дважды проверьте, что отсутствующий заголовок не находится в суперглобальном файле $_SERVER. В общем, я бы не стал полагаться на apache_*, если бы мне действительно пришлось.

Кстати, X-Requested-With уже стал стандартом? Я читал о различных библиотеках, добавляющих его, но я не знал, что он уже стал стандартом.

person Till    schedule 30.10.2008

Я не могу конкретно ответить на этот случай, но в целом я бы рекомендовал использовать параметр (query) для сигнализации запросов xmlhttp вместо заголовка. Вы никогда не знаете, какой забавный сервер безопасности или прокси-сервер может возиться с заголовками HTTP или кэшировать ответ AJAX, который должен был быть простым HTML-ответом браузера (или наоборот).

person bobince    schedule 30.10.2008