Как я могу обнаружить запросы от Получить API в PHP?
В настоящее время я использую подход ниже, чтобы обнаружить запрос AJAX:
$context['isAJAX'] = (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
В идеале я мог бы обнаружить запросы Fetch таким же образом. У кого-нибудь есть какие-либо методы для достижения этой цели?
Не существует надежного способа отличить запрос, выполненный с использованием API Fetch, от запроса, сделанного с использованием XHR, или от какой-либо библиотеки AJAX. Fetch API не вызывает отправку каких-либо уникальных заголовков.
Если вы просто хотите определить, был ли запрос сделан из кода внешнего интерфейса, запущенного в браузере, вы можете проверить Origin
заголовок. Браузеры добавляют Origin
заголовок для всех перекрестных источников GET
Запросы. Так что если GET
запрос был сделан тем же источником из браузера, он не будет иметь Origin
,
И браузеры отправляют ORIGIN
для того же происхождения POST
запросы, а не только перекрестного происхождения POST
Запросы.
И браузеры отправляют ORIGIN
для запросов, сделанных с помощью XHR, а не только запросов от Fetch API.
Таким образом, на стороне сервера нет надежного способа определить, был ли сделан запрос с помощью API Fetch.
Кстати, если вы проверяете X-Requested-With
заголовок запроса, все что вам скажут, это, вероятно, запрос был сделан с помощью обычного стороннего AJAX библиотека вместо того, чтобы напрямую с XHR или Fetch API. Это потому что X-Requested-With
не является стандартом (поэтому его название начинается с X-
) и никогда не отправляется непосредственно самими браузерами, а ведущими библиотеками.
Так что я думаю, если вы не увидеть X-Requested-With
заголовок запроса, тогда, по крайней мере, вы знаете, что запрос, вероятно, не был отправлен кодом с использованием каких-либо методов AJAX в любой из основных библиотек, хотя это просто означает, что он также мог быть отправлен из curl
или что-то вместо браузера.
И если вы видите Origin
заголовок запроса, но не X-Requested-With
запрос, по крайней мере, вы знаете, что запрос, вероятно, был отправлен из браузера, но не с использованием основной библиотеки — хотя есть некоторая возможность, что он все еще мог быть отправлен с curl
или кто-то еще, кто-то вручную добавил Origin
заголовок к запросу.
Других решений пока нет …