На всем протяжении Интернета, включенного даже здесь в Переполнение стека, люди заявляют, что хороший способ проверить, является ли запрос 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']
если это доступно.
echo $_SERVER['HTTP_X_REQUESTED_WITH'];
Чего вы ожидали от такого кода? Предположим, вы запускаете его прямо из браузера, не используя запрос AJAX. Итак, как получилось установить этот заголовок?
Ответ на главный вопрос жизни, Вселенной и всего остального - сниффер HTTP ! Возьмите себе такой и забудьте о выводе переменной $ _SERVER.
Firebug имеет один, или вы можете использовать Fiddler HTTP-прокси или плагин LiveHTTPHeaders Mozilla. Мне скучно делать ссылки, но это легко гуглить.
Таким образом, с HTTP-сниффером вы можете быть уверены в любом HTTP-заголовке.
Обратите внимание, что вы не можете предотвратить любой «прямой доступ» с помощью XHR, поскольку каждый HTTP-запрос к вашему серверу уже является «прямым».
Переменные в $ _ SERVER
на самом деле не являются частью PHP, поэтому вы не найдете их в документации PHP.Они подготавливаются веб-сервером, который передает их языку сценариев.
Насколько мне известно, X-Requested-With
отправляется функциями Ajax большинства основных фреймворков, но не всех (например, Dojo добавил его всего два года назад: № 5801 ). Таким образом, и принимая во внимание комментарии @bobince ', можно с уверенностью сказать, что это обычно не 100% надежный метод определения того, является ли запрос запросом AJAX или нет.
Единственный 100% безопасный способ - это отправить заранее определенный флаг (например, переменную GET) вместе с запросом и для принимающей страницы проверить наличие этого флага.
Ключи $ _ SERVER
, которые начинаются с HTTP_
, генерируются из заголовков запросов HTTP. В этом случае заголовок X-Requested-With
.
Этот заголовок находится в процессе стандартизации всех библиотек AJAX.
Это не будет описано в документации php как таковой, а скорее в различных библиотеках AJAX, которые устанавливают этот заголовок. Общие библиотеки отправляют этот заголовок: jQuery, Mojo, Prototype, ...
Обычно эта библиотека устанавливает заголовок, используя
xhrobj.setRequestHeader("X-Requested-With", "XMLHttpRequest");