本地服务器识别但在线服务器不识别的 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 请求标头的主要内容,如果未能解决你的问题,请参考以下文章