Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP apache_request_headers() diagrees with reality (as confirmed by Firebug): why?

I have written a web app in PHP which makes use of Ajax requests (made using YUI.util.Connect.asyncRequest).

Most of the time, this works fine. The request is sent with an X-Requested-With value of XMLHttpRequest. My PHP controller code uses apache_request_headers() to check whether an incoming request is Ajax or not and all works well.

But not always. Intermittently, I'm getting a situation where the Ajax request is sent (and Firebug confirms for me that the headers on the request include an X-Requested-With of XMLHttpRequest) but apache_request_headers() is not returning that header in its list.

The output from when I var_dump the apache_request_headers() is as follows (note the lack of 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)

But Firebug tells me:

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

This mismatch is (apparently) intermittent when executing the same code. But I don't believe in "intermittent" when it comes to software! Help!

like image 577
Peter Howe Avatar asked Oct 30 '08 12:10

Peter Howe


2 Answers

I'm not sure why the apache_request_headers() and firebug mismatching, but in order to read request headers you can use the $_SERVER super global

each header that is being sent by a client (and it doesn't matter how is the client) will arrive to the $SERVER array. The key of that header will be with HTTP prefix, all letters capital and dash is converted to underscore (_)

in your case you can find your necessary value in:

$_SERVER['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'

like image 200
user27987 Avatar answered Oct 10 '22 18:10

user27987


For future reference of those coming across this question, the "intermittent" may be due to a redirect happening server-side. If a 302 redirect occurs the X-Requested-With header isn't passed along even though it's been sent in the original request. This may have been the original cause of the problem.

like image 39
pnomolos Avatar answered Oct 10 '22 19:10

pnomolos