如何在PHP中检测来自Fetch API的请求? 我目前使用下面的方法来检测AJAX请求:在PHP中检测提取请求
$context['isAJAX'] = (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
理想我可以检测取以类似的方式请求。有没有人有任何技术来完成这个?
如何在PHP中检测来自Fetch API的请求? 我目前使用下面的方法来检测AJAX请求:在PHP中检测提取请求
$context['isAJAX'] = (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
理想我可以检测取以类似的方式请求。有没有人有任何技术来完成这个?
没有可靠的方法来区分使用Fetch API与使用XHR或某个AJAX库创建的请求。提取API不会导致发送任何唯一标头。
如果你只是想检测一个请求是从前端代码在浏览器中运行的可能,您就可以通过检查Origin
头。浏览器将Origin
标题添加到所有跨源GET
请求。因此,如果GET
请求与浏览器的源相同,它将不具有Origin
。
而浏览器发送ORIGIN
为同源POST
请求,而不仅仅是交叉源POST
请求。
而且浏览器也发送ORIGIN
来处理使用XHR进行的请求,而不仅仅是来自提取API的请求。
所以没有可靠的方法来检测服务器端是否使用Fetch API进行请求。
顺便说一句,如果你检查的X-Requested-With
请求头,所有这一切要告诉你的是,该请求可能与一个常见的第三方AJAX 库,而不是直接与XHR或提取API制作。这是因为X-Requested-With
不是标准(这就是为什么它的名字以X-
开头),并且绝不会由浏览器本身发送,而是由主要的图书馆发送。
所以我想如果你不看到X-Requested-With
请求头,那么至少你知道该请求可能没有被使用任何在任何主要图书馆的AJAX方法的代码发送,尽管这只是意味着它也可能来自curl
或其他东西,而不是浏览器。
如果你看到Origin
请求头,但不是X-Requested-With
请求,那么至少你知道该请求可能是从一个浏览器发送的,但不是使用大图书馆虽然有一些可能性,但仍可能已与curl
发送或不管怎样,有人手动为请求添加了Origin
标头。
非常感谢您的详细解答。为了澄清,我不需要区分通过XHR和Fetch创建的请求 - 我需要来自同一来源的任何GET请求的通用布尔值,无论它们是XHR还是Fetch。有了这个说法,基于你的回答,似乎我可以检查“Origin”标题。 “Origin”标头的缺失是否确认它确实是来自同一来源的GET请求? –
对于在浏览器中运行的JavaScript启动的'GET'请求,没有'Origin'请求标头就表明请求是同源的。 (但是,如果有人在请求中显式设置'mode:no-cors',它也会缺少Origin;但是设置'mode:no-cors'几乎总是一个错误,并且使用该模式创建的请求几乎是永远不会按照作者的意图工作,所以我认为这是一个可以被认为是编程错误的优势。) – sideshowbarker