Überall im Internet, auch hier bei Stack Overflow, geben die Leute an, dass eine gute Möglichkeit, um zu überprüfen, ob eine Anfrage AJAX ist oder nicht, Folgendes ist:
if (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest' ) {...}
Ich sehe jedoch nicht $_SERVER['HTTP_X_REQUESTED_WITH']
in der offiziellen PHP-Dokumentation
Und wenn ich Folgendes versuche:
echo $_SERVER['HTTP_X_REQUESTED_WITH'];
Es wird nichts ausgegeben.
Mache ich etwas falsch? Weil ich wirklich gerne verwenden kann, $_SERVER['HTTP_X_REQUESTED_WITH']
wenn es verfügbar ist.
quelle
Vary: X-Requested-With
der Antwort kombinieren ... was wiederum das Cacheing im IE vermasselt. Viele Leute benutzen esX-Requested-With
, aber ich denke, es ist eine schreckliche Idee. Übergeben Sie besser ein Flag in den Abfrageparametern, um zu signalisieren, dass Sie eine Antwort im XMLHttp-Stil (oder JSON) wünschen.Vary
Problem wird mit Ihnen schrauben, wenn Sie alles andere alsnocache
Antworten haben. Der Aufwand lohnt sich nicht, da sich die Schönheit eines Headers nur geringfügig verbessert. gehe mit einem einfachen Parameter.Vergessen Sie nicht, dass Sie mit cURL jeden Header leicht fälschen können
curl_setopt($ch,CURLOPT_HTTPHEADER,array("X-Requested-With : XMLHttpRequest"));
quelle
$_SERVER
Schlüssel, die mit beginnen,HTTP_
werden aus HTTP-Anforderungsheadern generiert. In diesem Fall derX-Requested-With
Header.quelle
Dieser Header ist eine laufende Standardisierung aller AJAX-Bibliotheken.
Es wird nicht in der PHP-Dokumentation an sich dokumentiert, sondern in den verschiedenen AJAX-Bibliotheken, die diesen Header setzen. Allgemeine Bibliotheken haben diesen Header gesendet: jQuery, Mojo, Prototype, ...
Normalerweise setzen diese Bibliotheken den Header mit
xhrobj.setRequestHeader("X-Requested-With", "XMLHttpRequest");
quelle
Hier ist eine kurze Funktion mit Beispielverwendung:
function isXmlHttpRequest() { $header = isset($_SERVER['HTTP_X_REQUESTED_WITH']) ? $_SERVER['HTTP_X_REQUESTED_WITH'] : null; return ($header === 'XMLHttpRequest'); } // example - checking our active call if(!isXmlHttpRequest()) { echo 'Not an ajax request'; } else { echo 'is an ajax request'; }
quelle
$_SERVER['HTTP_X_REQUESTED_WITH']
kommt, wo es eingestellt ist und ob / warum wir uns wirklich darauf verlassen können.echo $_SERVER['HTTP_X_REQUESTED_WITH'];
Was haben Sie von einem solchen Code erwartet? Angenommen, Sie führen es direkt über den Browser aus und verwenden keine AJAX-Anforderung. Wie kommt es, dass dieser Header gesetzt werden kann?
Nun, die Antwort auf die ultimative Frage des Lebens, des Universums und alles - ein HTTP-Sniffer ! Holen Sie sich eine und vergessen Sie das Drucken der Variablen $ _SERVER.
Firebug hat einen, oder Sie möchten möglicherweise den Fiddler HTTP-Proxy oder das LiveHTTPHeaders Mozilla-Plugin verwenden. Es ist mir langweilig, Links zu erstellen, aber es wird leicht gegoogelt.
Mit dem HTTP-Sniffer können Sie also sicher sein, dass es jemals einen HTTP-Header gibt.
Beachten Sie, dass Sie mit XHR keinen "direkten Zugriff" verhindern können, da jede HTTP-Anforderung an Ihren Server bereits "direkt" ist.
quelle
Sie können auch einige Browserfehler beschuldigen - siehe diese Frage und ihre Lösung für Firefox
Firefox behält während der Ajax-Anforderungsumleitung keine benutzerdefinierten Header bei: eine ASP.NET MVC-Lösung
IE hat auch Caching-Problem das schwerwiegender ist als die Erkennung der Anforderungsmethode.
Sie müssen ohnehin Cache-Busters hinzufügen, um das Caching zu vermeiden. Warum also nicht ein anderes Flag verwenden, um den Ajax-Aufruf anzugeben? Oder besser, Sie können eine andere URL wie http://ajax.mysite.com/endpoint/sevice?params verwenden
quelle
Die beste Lösung, um sicherzustellen, dass eine HTTP-Anfrage wirklich über AJAX gesendet wird, ist die SESSION-Prüfung. Sie senden session_id in einem get-Parameter und überprüfen diese Sitzung, ob dies zulässig ist oder nicht!
quelle
$headers = apache_request_headers(); $is_ajax = (isset($headers['X-Requested-With']) && $headers['X-Requested-With'] == 'XMLHttpRequest');
quelle
Ich stimme Pekka zu. Es gibt keine zuverlässige native Methode zwischen Vorder- und Rückseite, mit der automatisch erkannt werden kann, ob ein Client mithilfe von AJAX tatsächlich einen Endpunkt aufruft.
Für meinen eigenen Gebrauch habe ich einige Hauptmethoden, um zu überprüfen, ob ein Client einen meiner Endpunkte anfordert:
Ich kann HTTP_X_REQUESTED_WITH verwenden, wenn ich mich nicht im domänenübergreifenden Kontext befinde.
Anstatt "X-request-with" zu überprüfen, überprüfe ich $ _SERVER ['HTTP_ORIGIN'] (das von einer AJAX-Anforderung gesendet wird), um domänenübergreifende Berechtigungen zu verarbeiten. Der Hauptgrund, warum ich prüfe, ob eine Anfrage eine AJAX-Anfrage ist, liegt hauptsächlich in domänenübergreifenden Berechtigungen, die diesen PHP-Code verwenden: header ('Access-Control-Allow-Origin:'. $ _ SERVER [' HTTP_ORIGIN ']); // Wenn dieses "HTTP_ORIGIN" in meiner weißen Liste ist
Meine APIs erwarten vom Client, dass in einigen Fällen der Datentyp (JSON, HTML usw.) in eine GET- oder POST-Variable explizit angegeben wird. Zum Beispiel überprüfe ich, ob $ _REQUEST ['ajax'] nicht leer ist oder einem erwarteten Wert entspricht.
quelle
Sie müssen es speziell in Ihrem Ajax-Anforderungsobjekt festlegen (dh, wenn Sie kein Framework wie jQuery verwenden), sondern in Javascript. wie so:
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
Wo
xhr
ist Ihr Anfrageobjekt?Dann
PHP
wird es nun$_SERVER
wie folgt empfangen und in die globale Variable gesetzt :$_SERVER['HTTP_X_REQUESTED_WITH']
Andernfalls ist $ _SERVER ['HTTP_X_REQUESTED_WITH'] immer null.
Hinweis : Stellen Sie in Ihrem Javascript sicher, dass Sie Header festlegen, nachdem die Anforderung geöffnet ist. Ich meine nach
xhr.open()
Methode.quelle