如果有人从some-client.com
向some-rest.com
发送XHR请求,我希望使用PHP获取请求的来源(域名,而不是客户端IP )。
可能的解决方案:
$_SERVER['HTTP_ORIGIN']
,但我不知道它是否是标准。$_SERVER['HTTP_HOST']
或$_SERVER['SERVER_NAME']
,但有些情况下会返回真实的hostname
,而不是真正的domain
。$_SERVER['REMOTE_ADDR']
为客户提供IP。什么是使用PHP获取域名等请求来源的正确方法?
谢谢!
答案 0 :(得分:15)
根据MDN的文章 php_pdo.dll :
必须将所有请求设置为Origin
标头才能在CORS(跨源资源共享)机制下正常工作。
" 来源"请求标头是HTTP access control (CORS)的一部分,将其描述为CORS机制的一部分,并且根据MDN与所有浏览器兼容。
MDN的描述:
Origin
请求标头指示提取源自的位置。它 不包含任何路径信息,但只包含服务器名称。它是 与CORS请求一起发送,以及POST请求。它很相似 对于Referer标题,但是,与此标题不同,它没有公开 整条道路。来源:RFC 6454
MDN示例: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Origin
因此,要使用PHP获取XHR请求的来源,您可以使用:
$_SERVER['HTTP_ORIGIN']
并且,在直接请求的情况下,您可以将 HTTP_REFERER
和REMOTE_ADDR
合并为:
if (array_key_exists('HTTP_REFERER', $_SERVER)) {
$origin = $_SERVER['HTTP_REFERER'];
} else {
$origin = $_SERVER['REMOTE_ADDR'];
}
因此,可能的最终解决方案是:
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'];
}
非常感谢@trine,@ waseem-bashir,@ p0lt10n以及其他人的帮助。
答案 1 :(得分:1)
在php中你可以使用$ _SERVER ['HTTP_REFERER']。 如果您使用的是codeigniter,那么您可以使用$ this-> agent-> is_referral()获取推荐人。
答案 2 :(得分:1)
$_SERVER['HTTP_ORIGIN'] // HTTP Origin header
$_SERVER['HTTP_HOST'] // HTTP Host header
$_SERVER['HTTP_REFERER'] // HTTP Referer header
$_SERVER['REMOTE_ADDR'] // HTTP Client's Public IP
让我们讨论上面$_SERVER
个参数。
首先,XHR位于客户端,它与http客户端绑定。由于Origin和Referer标头不是必需的,因此标准Web浏览器以外的客户端不会设置该标头。下一个主机头可能不是必需的。如果您的REST服务器使用虚拟主机,则必须使用此标头正确路由请求。但是这个标题并没有关于客户端的任何细节。 http客户端唯一独特的东西是Public IP。但这对应于许多客户,因为ISP使用网络地址转换或代理。
由于所有内容都是相对的并且在边界内,因此{DOM}类似机制构建在HTTP Origin头上。假设客户并建议客户使用标准浏览器。
在你的情况下,我认为依赖Origin标题是可以的。如果适合你,你可以实施CORS机制。