Jor*_*sen 7 php apache ajax request cross-domain
如果有人发送XHR请求some-client.com
来some-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
因此,要使用PHP获取XHR请求的来源,您可以使用:
$_SERVER['HTTP_ORIGIN']
Run Code Online (Sandbox Code Playgroud)
并且,在直接请求的情况下,您可以组合 HTTP_REFERER
并REMOTE_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和其他人的帮助.
归档时间: |
|
查看次数: |
17013 次 |
最近记录: |