views:

833

answers:

4

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!

A: 

Double-check that the missing header is not in the superglobal $_SERVER. In general, I wouldn't rely on apache_* if I really had to.

On a side-note, is X-Requested-With the standard yet? I've read about various libraries adding it, but I didn't know that it became the standard yet.

Till
+5  A: 

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'

A: 

I can't specifically answer this case, but in general I'd recommend using a (query) parameter to signal xmlhttp requests, instead of a header. You never know what funny security or proxy server might take it upon itself to fiddle with HTTP headers, or to cache an AJAX response that should have been a plain browser HTML response (or vice-versa).

bobince
A: 

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.

pnomolos