2008-10-30 4 views
5

Ich habe eine Web-App in PHP geschrieben, die Ajax-Anfragen verwendet (die mit YUI.util.Connect.asyncRequest erstellt wurden).PHP apache_request_headers() stimmt mit der Realität überein (wie von Firebug bestätigt): Warum?

Die meiste Zeit funktioniert das gut. Die Anfrage wird mit einem X-Requested-With Wert von XMLHttpRequest gesendet. Mein PHP-Controller-Code verwendet apache_request_headers(), um zu überprüfen, ob eine eingehende Anfrage Ajax ist oder nicht, und alles funktioniert gut.

Aber nicht immer. Zwischenzeitlich bekomme ich eine Situation, in der die Ajax-Anfrage gesendet wird (und Firebug bestätigt mir, dass die Header auf der Anfrage ein X-Requested-With von XMLHttpRequest enthalten), aber apache_request_headers() gibt diesen Header nicht in seiner Liste zurück.

Der Ausgang aus, wenn ich var_dump die apache_request_headers() ist wie folgt (man beachte das Fehlen von 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) 

Aber Firebug sagt mir:

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 

Diese Diskrepanz ist (scheinbar) intermittierende wenn ich den gleichen Code ausführe Aber ich glaube nicht an "intermittierend", wenn es um Software geht! Hilfe!

Antwort

7

Ich bin nicht sicher, warum die apache_request_headers() und Firebug unpassende, aber um Request-Header lesen können Sie die _SERVER Super $ verwenden globale

jeder Header, der von einem Client gesendet wird (und es doesn Es spielt keine Rolle, wie der Client ist), um das $ SERVER-Array zu erreichen. Der Schlüssel dieser Header mit HTTP Präfix sein wird, alle Buchstaben Kapital und Strich wird umgewandelt Strich (_)

in Ihrem Fall können Sie Ihren notwendigen Wert finden in:

$ _SERVER [ ‚HTTP_X_REQUESTED_WITH‘ ] = 'XMLHttpRequest'

0

Überprüfen Sie, dass der fehlende Header nicht in der Superglobalist. Im Allgemeinen würde ich mich nicht auf apache_ * verlassen, wenn ich wirklich müsste.

Nebenbei bemerkt, ist X-Requested-Mit dem Standard noch? Ich habe gelesen, dass verschiedene Bibliotheken es hinzugefügt haben, aber ich wusste nicht, dass es der Standard wurde.

0

Ich kann diesen Fall nicht spezifisch beantworten, aber im Allgemeinen würde ich empfehlen, einen (Abfrage-) Parameter zu verwenden, um xmlhttp-Anfragen anstelle einer Kopfzeile zu signalisieren. Sie wissen nie, was für ein komischer Sicherheits- oder Proxy-Server es sein könnte, mit HTTP-Headern herumzuspielen oder eine AJAX-Antwort zwischenzuspeichern, die eigentlich eine einfache Browser-HTML-Antwort hätte sein sollen (oder umgekehrt).

1

Für zukünftige Referenz von denen, die über diese Frage kommen, kann die "intermittierende" aufgrund einer Umleitung passieren Server-Seite. Wenn eine 302-Weiterleitung stattfindet, wird der X-Requested-With-Header nicht weitergegeben, obwohl er in der ursprünglichen Anforderung gesendet wurde. Dies könnte die ursprüngliche Ursache des Problems gewesen sein.

Verwandte Themen