Существует ли $_SERVER ['HTTP_X_REQUESTED_WITH'] в PHP или нет?

Всюду по Интернету, включенную даже здесь, в Stack Overflow, люди заявляют, что хороший способ проверить, является ли запрос AJAX или нет, заключается в следующем:

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

Однако я не вижу $_SERVER['HTTP_X_REQUESTED_WITH'] в официальной документации PHP

И когда я пытаюсь сделать следующее:

echo $_SERVER['HTTP_X_REQUESTED_WITH'];

Ничего не выводится.

Я что-то делаю неправильно? Потому что я действительно хотел бы использовать $_SERVER['HTTP_X_REQUESTED_WITH'], если он доступен.

Ответ 1

Переменные в $_SERVER не являются частью PHP, поэтому вы не найдете их в документации PHP. Они подготовлены веб-сервером, который передает их на язык сценариев.

Насколько мне известно, X-Requested-With отправляется функциями Ajax большинства основных Framework, но не все (Dojo, например, добавлено только два года назад: # 5801). Как таковой, и принимая во внимание комментарии @bobince ', можно с уверенностью сказать, что это не как правило 100% надежный метод, чтобы определить, является ли запрос AJAX-запросом или нет.

Единственный 100% -ный безопасный способ - отправить заранее определенный флаг (например, GET-переменную) вместе с запросом и для страницы-получателя, чтобы проверить наличие этого флага.

Ответ 2

не забывайте, что вы можете легко обманывать любой заголовок cURL, например,

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

Ответ 3

Клавиши

$_SERVER, начинающиеся с HTTP_, генерируются из заголовков HTTP-запросов. В этом случае заголовок X-Requested-With.

Ответ 4

Этот заголовок является стандартизирующим процессом из всех библиотек AJAX.

Он не будет документирован в документации php per se, а скорее в разных библиотеках AJAX, которые устанавливают этот заголовок. Общие библиотеки отправляют этот заголовок: jQuery, Mojo, Prototype,...

Обычно эта библиотека устанавливает заголовок, используя

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

Ответ 5

Вот быстрая функция с использованием примера:

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

Ответ 6

echo $_SERVER['HTTP_X_REQUESTED_WITH'];

Что вы ожидаете от такого кода? Предположим, что вы запускаете его непосредственно из браузера, не используя запрос AJAX. Итак, как можно настроить этот заголовок?

Хорошо ответ на конечный вопрос жизни, Вселенной и всего - сниффер HTTP! Получите себя и забудьте распечатать переменную $_SERVER.

Firebug имеет один, или вы можете использовать Fiddler HTTP-прокси или LiveHTTPHeaders Mozilla-плагин. Мне скучно делать ссылки, но это легко googled.

Итак, с помощью сниффера HTTP вы можете быть уверены в каком-либо HTTP-заголовке.

Обратите внимание, что вы не можете предотвратить "прямой доступ" с помощью XHR, так как каждый HTTP-запрос на ваш сервер уже "прямо".

Ответ 7

Вы также можете обвинить некоторые ошибки браузера - см. этот вопрос и его решение для Firefox

Firefox не сохраняет пользовательские заголовки во время перенаправления запроса Ajax: решение ASP.NET MVC

IE также имеет проблему кэширования, которая более серьезна, чем обнаружение метода запроса.

В любом случае вам нужно добавить кэш-серверы, чтобы избежать кеширования, поэтому почему бы не использовать другой флаг для указания вызова ajax - или лучше, вы можете использовать другой URL-адрес, например http://ajax.mysite.com/endpoint/sevice?params

Ответ 8

$headers = apache_request_headers();
$is_ajax = (isset($headers['X-Requested-With']) && $headers['X-Requested-With'] == 'XMLHttpRequest');

Ответ 9

Лучшее решение, чтобы убедиться, что HTTP-запрос действительно отправлен через AJAX, использует проверку SESSION, вы отправляете session_id в параметр get, и вы проверяете этот сеанс, если это разрешено или нет!

Ответ 10

Я согласен с Пеккой. Не существует надежного нативного метода между передней и задней сторонами, которые могут автоматически определять, действительно ли клиент вызывает конечную точку с использованием AJAX.

Для моего собственного использования у меня есть несколько основных способов проверить, запрашивает ли клиент одну из моих конечных точек:

  • Я могу использовать HTTP_X_REQUESTED_WITH, когда я не в контексте перекрестного домена.

  • вместо проверки "X-request-with", я проверяю $_SERVER ['HTTP_ORIGIN'] (который отправляется из запроса AJAX), намереваясь обрабатывать междоменные разрешения. Большая часть времени, основная причина, по которой я проверяю, является ли запрос AJAX-запросом, особенно из-за перекрестных доменных разрешений, используя этот заголовок PHP code: 'Access-Control-Allow-Origin:'. $_ SERVER [' HTTP_ORIGIN ']);//Если этот "HTTP_ORIGIN" находится в моем белом списке

  • мои API ожидают от клиента явного, в немногих случаях, типа данных (JSON, HTML и т.д.) в GET или POST var. Например, я проверяю, не является ли $_REQUEST ['ajax'] пустым или равным ожидаемому значению.