如何用PHP获取请求的来源?

Jor*_*sen 7 php apache ajax request cross-domain

如果有人发送XHR请求some-client.comsome-rest.com,我想获得原点(域名,而不是客户端IP与PHP请求).

可能的解决方案:

  • 也许我可以使用,$_SERVER['HTTP_ORIGIN']但我不知道它是否是一个标准.
  • 我看到另一个标题像$_SERVER['HTTP_HOST']$_SERVER['SERVER_NAME'],但有些情况下这会返回真实hostname而非真实domain.
  • $_SERVER['REMOTE_ADDR']给客户端IP.

什么是使用PHP获取域名等请求的正确方法?

谢谢!

Jor*_*sen 18

根据MDN 的文章HTTP访问控制(CORS):

必须将所有请求设置Origin为在CORS(跨源资源共享)机制下正常工作.

" Origin "请求头是RFC 6454的一部分,并将其描述为CORS机制的一部分,并且根据MDN与所有浏览器兼容.

MDN的描述:

Origin请求报头指示其中从取起源.它不包含任何路径信息,只包含服务器名称.它与CORS请求以及POST请求一起发送.它与Referer标题类似,但与此标题不同,它不会公开整个路径.

资料来源:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Origin

MDN的例子: 在此输入图像描述

因此,要使用PHP获取XHR请求的来源,您可以使用:

$_SERVER['HTTP_ORIGIN'] 
Run Code Online (Sandbox Code Playgroud)

并且,在直接请求的情况下,您可以组合 HTTP_REFERERREMOTE_ADDR喜欢:

if (array_key_exists('HTTP_REFERER', $_SERVER)) {
    $origin = $_SERVER['HTTP_REFERER'];
} else {
    $origin = $_SERVER['REMOTE_ADDR'];
}
Run Code Online (Sandbox Code Playgroud)

因此,可能的最终解决方案是:

if (array_key_exists('HTTP_ORIGIN', $_SERVER)) {
    $origin = $_SERVER['HTTP_ORIGIN'];
}
else if (array_key_exists('HTTP_REFERER', $_SERVER)) {
    $origin = $_SERVER['HTTP_REFERER'];
} else {
    $origin = $_SERVER['REMOTE_ADDR'];
}
Run Code Online (Sandbox Code Playgroud)

MDN是Mozilla开发者网络.

非常感谢@trine,@ waseem-bashir,@ p0lt10n和其他人的帮助.