PHP: $ _SERVER ['HTTP_X_REQUESTED_WITH'] var mı, yok mu?

8 Cevap php

Tüm internet üzerinden, StackOverlow de, insanlar bir isteği AJAX ya da değil aşağıdakileri yapmak için ise iyi bir yol kontrol belirtiyorlar burada bile dahil:

if (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest' ) {...}

Ancak, ben görmüyorum $_SERVER['HTTP_X_REQUESTED_WITH'] official PHP documentation olarak

Ve ben aşağıdakileri yapmaya çalıştığınızda:

echo $_SERVER['HTTP_X_REQUESTED_WITH'];

Hiçbir şey çıkılır.

Ben yanlış bir şey yapıyorum? Gerçekten eğer kullanılabilir $_SERVER['HTTP_X_REQUESTED_WITH'] kullanmak mümkün istiyorum çünkü.

8 Cevap

In değişkenler $_SERVER gerçekten PHP belgelerinde bunları bulamazsınız neden PHP, parçası değildir. Onlar betik dili üzerine geçirir Web sunucusu tarafından hazırlanır.

Bildiğim kadarıyla, X-Requested-With en büyük Altyapıları Ajax fonksiyonları tarafından gönderilen ama hepsi değil (Dojo, örneğin, sadece iki yıl önce eklendi: #5801). Bu tür, ve bobince 'yorumlarına @ düşünceler içine alarak, onu genellikle bir istek bir AJAX isteği olup olmadığını belirlemek için% 100 güvenilir bir yöntem değil demek güvenlidir.

Sadece% 100 güvenli yol bu bayrak varlığını kontrol etmek isteği ile ve alan sayfanın boyunca önceden tanımlanmış bir bayrağı (örneğin bir değişkeni GET) göndermektir.

Kolayca şöyle cURL ile herhangi bir başlık parodi olduğunu unutmayın

curl_setopt($ch,CURLOPT_HTTPHEADER,array("X-Requested-With : XMLHttpRequest"));

$_SERVER HTTP_ isteği HTTP başlıklarını oluşturulur ile başlar tuşları. Bu durumda, X-Requested-With başlığı.

Bu başlık bir standardizasyon-in-progress orada ajax kütüphaneleri tüm olduğunu.

Bu başına se php belgelerinde belgelenen, ama oldukça bu başlık farklı ajax kütüphanelerde olmayacaktır. Ortak kütüphaneler bu başlığını gönderen yok (jQuery, Mojo, Prototype, ..)

Genellikle bu kütüphane kullanarak başlığını koyacaktır

xhrobj.setRequestHeader("X-Requested-With", "XMLHttpRequest");

I Hope this will help you, Jerome Wagner

echo $_SERVER['HTTP_X_REQUESTED_WITH'];

Eğer böyle bir koddan bekliyordun? AJAX isteği kullanarak değil, doğrudan tarayıcıdan çalıştırırken varsayalım. Peki, bu nasıl başlık gelip ayarlanmış olabilir?

Peki Hayat, Evren ve Her şey Ultimate Soru Cevap - Bir HTTP sniffer! Kendinize bir alın ve baskı $ _SERVER değişkenin unutma.

Kundakçı bir tane var, yoksa Fiddler HTTP Proxy veya LiveHTTPHeaders Mozilla eklenti kullanmak isteyebilirsiniz. Ben bağlantı yapmak sıkıldım ama kolayca Google'da.

Yani, HTTP ile şimdiye kadar herhangi bir HTTP başlığının emin olabilirsiniz sniffer.

Sizin sunucuya her HTTP isteği zaten "doğrudan" olduğu gibi, xhr kullanarak herhangi bir "doğrudan erişim" engel unutmayın.

Ayrıca bazı tarayıcı hataları suçlayabilirsiniz - bu soruyu ve Firefox için çözüm görmek

Firefox does not preserve custom headers during Ajax request redirect: an ASP.NET MVC solution

IE de o istek yöntemin tespiti daha ciddi caching issue hangi sahip.

Zaten önbelleğe önlemek için önbellek buster'ları eklemek gerekiyor, bu yüzden neden ajax arama belirtmek için başka bir bayrak kullanmayın - Sen http://ajax.mysite.com/endpoint/sevice?params gibi farklı bir URL kullanabilirsiniz ya da daha iyi

Here's a quick function with example usage:

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';
}

Bir HTTP isteği gerçekten AJAX yoluyla gönderilen emin olmak için en iyi çözüm bir get parametresinde session_id göndermek, OTURUM denetimi kullanıyor ve siz buna izin eğer bu oturumu kontrol edin ya da değil!