【问题标题】:HTTP request header recognized by local server but not online server本地服务器识别但在线服务器不识别的 HTTP 请求标头
【发布时间】:2015-04-01 23:47:20
【问题描述】:

我制作了一个简单的 PHP 应用程序,它提供 RESTful API 用于注册、登录和更新用户的地理位置。我在本地 Apache 服务器上使用 MySQL 数据库对其进行了测试,一切都很好。

最近我将PHP代码迁移到了一个在线主机HostGator。我的部分代码在涉及识别 HTTP 请求标头时停止工作。像这样:

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.93 Safari/537.36
Origin: chrome-extension://hgmloofddffdnphfgcellkdfbfbjeloo
Authorization: f0cc696e44f76f9638331b5487f4b01d
Content-Type: application/x-www-form-urlencoded 
Accept: */*
DNT: 1
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4

我编写了我的 PHP 代码,以便它读取标题 Authorization 下的 api-key。它在我的本地服务器上运行良好,但在 HostGator

上迁移相同的代码时报告 api-key missing

我怀疑在我的本地环境中可能存在某些默认设置,但需要在 HostGator 中明确设置。这是我当前的 .htaccess:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ %{ENV:BASE}index.php [QSA,L]
AddType application/x-httpd-php54 .php

我将 XAMPP 用于本地服务器和数据库,并使用 Chrome 扩展程序 Advanced Rest Client 发送 HTTP 请求。

编辑:我检索标头值的代码:

$headers = apache_request_headers();

if (isset($headers['Authorization'])) {
    $api_key = $headers['Authorization'];
    // validating api key
    // ...
} else {
    // api key is missing in header
    // ...
}

【问题讨论】:

    标签: php apache .htaccess rest hosting


    【解决方案1】:

    您正在使用自定义 API 密钥的授权标头。这不是它的意图,Apache 将丢弃无效的授权标头。
    我从Request headers bag is missing Authorization header in Symfony 2?了解到这一点

    因此,您需要做的是使用实际的自定义标头。 而不是使用授权字段将您的密钥发送为

    X-Apikey: this_is_my_magic_key_that_put_in_the_header
    

    然后将其检索为

    $headers['X-Apikey'];
    

    Apache 不会丢弃它。

    注意:标题将在新词上使用 CamelCased。发送“X-API-KEY”就变成了“X-Api-Key”所以使用上面的格式就可以正常检索了。

    【讨论】:

    • 对自定义标题的深入了解!以防万一,我解决了它,而是在我的 .htaccess 文件中添加了一条规则:RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    【解决方案2】:

    您没有发布有关如何检索“授权”标头的代码

    我建议查看接收 PHP 脚本中的 SERVER 变量。

    $myauthorization=$_SERVER['HTTP_Authorization'];
    

    这行不通。查看可用的内容

    print_r($_SERVER);
    

    【讨论】:

    • 感谢您的建议!放入 print_r 后,我得到“Unexpected token A”...不知道这是什么意思
    • 我发现我遇到了“意外的令牌 A”错误,因为我的服务器响应是 json。所以现在看起来服务器接收到诸如“Accept-Language”之类的常规标题就好了,但不是我的自定义标题
    • 发布您的 print_r($headers);
    • 我做到了...查看我的第一条评论。因此,如果我将 json 响应考虑在内, $headers[Authorization] 给出“null”,但 $headers[Accept-Language] 给出“zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q= 0.4" 这是正确的
    【解决方案3】:

    授权RFC 2617 - HTTP 身份验证 的一部分,不能使用。只需将其重命名为另一个名称,它就可以正常工作。

    【讨论】:

      猜你喜欢
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-28
      • 2014-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多