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

时间:2016-12-26 03:48:57

标签: php ajax apache request cross-domain

如果有人从some-client.comsome-rest.com发送XHR请求,我希望使用PHP获取请求的来源(域名,而不是客户端IP )。

可能的解决方案:

  • 也许我可以使用$_SERVER['HTTP_ORIGIN'],但我不知道它是否是标准。
  • 我看到了另一个标题,例如$_SERVER['HTTP_HOST']$_SERVER['SERVER_NAME'],但有些情况下会返回真实的hostname,而不是真正的domain
  • $_SERVER['REMOTE_ADDR']为客户提供IP。

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

谢谢!

3 个答案:

答案 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_REFERERREMOTE_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'];
}

MDN是enter image description here

非常感谢@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机制。