如何在php中获取http请求源

m_j*_*ior 10 php apache post get http

我想创建一个API,并对API消费者进行身份验证,我将提供API KEY,App-id和App-Secret.问题是我想知道http请求的来源,以便我可以知道发出que请求的主机是否是注册的主机.例如:www.someone.com有一个app-id:0001,app-secret:1200和api-key:458.如果此凭据用于发出A请求,我想知道请求者是否真的是www.someone.com

hex*_*D49 16

通常,此标头应该可以完成这项工作.在此标头中包含域名

header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN'] . "");
// use domain name instead of $_SERVER['HTTP_ORIGIN'] above
Run Code Online (Sandbox Code Playgroud)

但如果您想查看更多信息,请使用以下代码段

$allowed = array('domain1', 'domain2', 'domain3'); 

if(isset($_SERVER['HTTP_ORIGIN']) && in_array($_SERVER['HTTP_ORIGIN'], $allowed)){
    // SELECT credentials for this user account from database
    if(isset($_GET['api_key'], $_GET['app_secret'])
        && $_GET['api_key'] == 'api_key_from_db' 
        && $_GET['app_secret'] == 'app_secret_from_db'
    ){
        // all fine
    }else{
        // not allowed
    }
}else{
    // not allowed
}
Run Code Online (Sandbox Code Playgroud)

如果用户必须将更多数据传递给您的服务,请使用POST而不是GET


Kam*_*ski 6

Laravel 5:在请求方法控制器中:

$origin = request()->headers->get('origin');
Run Code Online (Sandbox Code Playgroud)

  • 获取所有标头:`request()->headers->all();` (2认同)

Edu*_*rdo 6

从技术上讲,HTTP 标头既不是origin也不referer是必需的,所有这些答案都基于发送的特定浏览器标头,并且将您的系统基于客户端的不同行为是一个坏主意。

正确的答案是您无法可靠地获取每个请求的客户端来源,因为 HTTP 规范中并不要求它。


Sun*_*nit 5

使用$_SERVER['HTTP_REFERER']。它是将用户代理引导到当前页面的页面地址(如果有)。这是由用户代理设置的。HTTP_REFERER并非所有用户代理都会设置此项,有些用户代理提供了修改功能的能力。

如需进一步限制,您可以执行以下操作。example.com应该更改为您的域。

IIS 在 Web 配置中设置如下

add name="Access-Control-Allow-Origin" value="http://www.example.com"
Run Code Online (Sandbox Code Playgroud)

Apache 在 httpd.conf/apache.conf 中设置如下

Header add Access-Control-Allow-Origin "http://www.example.com"
Run Code Online (Sandbox Code Playgroud)

  • 引用者和来源是两个不同的东西。 (18认同)