在PHP中检测提取请求

在PHP中检测提取请求,php,fetch-api,Php,Fetch Api,如何在PHP中检测来自服务器的请求? 我目前正在使用以下方法检测AJAX请求: $context['isAJAX'] = (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'); 理想情况下,我可以以类似的方式检测Fetch请求。有人有任何技术来实现这一点吗?没有可靠的方法来区分使用Fetch API发出的请求

如何在PHP中检测来自服务器的请求? 我目前正在使用以下方法检测AJAX请求:

$context['isAJAX'] = (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');

理想情况下,我可以以类似的方式检测Fetch请求。有人有任何技术来实现这一点吗?

没有可靠的方法来区分使用Fetch API发出的请求和使用XHR或某个AJAX库发出的请求。Fetch API不会导致发送任何唯一的头

如果您只想检测请求是否可能来自浏览器中运行的前端代码,则可以通过检查
Origin
标题。浏览器向所有跨源
GET
请求添加
Origin
标题。因此,如果一个
GET
请求是从同一个浏览器发出的,它就不会有
origin

浏览器发送相同来源的
POST
请求,而不仅仅是跨来源的
POST
请求

浏览器也会发送
Origin
请求,而不仅仅是来自fetchapi的请求

因此,没有可靠的方法在服务器端检测是否使用fetchapi发出了请求

顺便说一句,如果您正在使用请求头检查
X-request-With
request-header,那么将告诉您的是,请求可能是通过一个通用的第三方AJAX库发出的,而不是直接通过XHR或Fetch-API发出的。这是因为
X-Requested-With
不是一个标准(这就是为什么它的名字以
X-
开头),它从来不是由浏览器本身发送的,而是由主要的库发送的

因此,我想如果您没有看到带有请求头的
X-request-With
request,那么至少您知道请求可能不是通过使用任何主要库中的任何AJAX方法的代码发送的,尽管这只是意味着它也可能是从
curl
或其他东西而不是浏览器发送的

如果您看到的是
Origin
请求头,而不是
X-Requested-With
请求,那么至少您知道该请求可能是从浏览器发送的,但没有使用主要的库,尽管它仍然可能是通过
curl
或其他方式发送的,如果有人手动在请求中添加了一个
来源
头。

添加到获取选项
标题:{'X-request-With':'XMLHttpRequest'}

非常感谢您的详细回答。为了澄清这一点,我不需要区分通过XHR和Fetch发出的请求——对于来自同一来源的任何GET请求,我需要一个通用的布尔值,无论它们是XHR还是Fetch。这么说来,根据你的回答,我似乎可以检查
Origin
标题。缺少
Origin
标头是否确认它确实是来自同一来源的GET请求?是的,对于从浏览器中运行的JavaScript启动的
GET
请求,缺少
Origin
请求标头将表明该请求是同一来源的。(然而,如果有人在请求中明确设置
模式:无cors
,它也将缺少
来源
;但是设置
模式:无cors
,几乎总是一个错误,使用该模式创建的请求几乎永远不会按照作者的预期工作,因此我认为这是一个可以被视为pr的优势。)如果您可以控制fetch语句所在的代码,那么这是一个非常明智的解决方法/垫片。