本地服务器识别但在线服务器不识别的 HTTP 请求标头

Posted

技术标签:

【中文标题】本地服务器识别但在线服务器不识别的 HTTP 请求标头【英文标题】:HTTP request header recognized by local server but not online server 【发布时间】: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:BASEindex.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
    // ...

【问题讨论】:

【参考方案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 身份验证 的一部分,不能使用。只需将其重命名为另一个名称,它就可以正常工作。

【讨论】:

以上是关于本地服务器识别但在线服务器不识别的 HTTP 请求标头的主要内容,如果未能解决你的问题,请参考以下文章

cnetos6,centos7添加新网卡,系统不识别的解决办法

私有化部署车牌识别的好处

人脸识别开发套件中的在线版本与离线版人脸识别的区别及详解

精准高效无所不识 OCR能力平台提供前沿图像识别

Qt项目ui文件中新添加的控件在代码中不识别的问题解决

如何配置 vscode 识别@文件路径