HTTP 请求 header 已被本地服务器识别但未被在线服务器识别
HTTP request header recognized by local server but not online server
我制作了一个简单的 PHP 应用程序,它提供 RESTful API 用于注册、登录和更新用户的地理位置。我在本地 Apache 服务器上使用 MySQL 数据库对其进行了测试,一切正常。
最近我将 PHP 代码迁移到在线主机 HostGator。我的部分代码在涉及识别 HTTP 请求时停止工作 header。像这样:
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 代码,它读取 header 授权 下的 api-key。它在我的本地服务器上运行良好,但在 HostGator
上迁移相同代码时报告 api-key 丢失
我怀疑在我的本地环境中可能有某些默认设置,但需要在 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 请求。
编辑:我检索 header 值的代码:
$headers = apache_request_headers();
if (isset($headers['Authorization'])) {
$api_key = $headers['Authorization'];
// validating api key
// ...
} else {
// api key is missing in header
// ...
}
您没有 post 检索代码 "Authorization" header
我建议您查看接收 PHP 脚本中的 SERVER 变量。
$myauthorization=$_SERVER['HTTP_Authorization'];
那是行不通的。查看可用的内容
print_r($_SERVER);
您正在使用自定义 API 密钥的授权 header。这不是它的意图,Apache 将丢弃无效的授权 header。
我从 Request headers bag is missing Authorization header in Symfony 2?
那里了解到
所以您需要做的是使用实际的自定义 header。
不要使用授权字段,而是将您的密钥发送为
X-Apikey: this_is_my_magic_key_that_put_in_the_header
然后将其检索为
$headers['X-Apikey'];
Apache 不会丢弃它。
注意:header 会在新词上采用驼峰式命名。发送"X-API-KEY"变成"X-Api-Key"所以用上面的格式就可以正常取回了
Authorization 是 RFC 2617 - HTTP Authentication 的一部分,它不能用过的。只需将其重命名为另一个名称即可。
我制作了一个简单的 PHP 应用程序,它提供 RESTful API 用于注册、登录和更新用户的地理位置。我在本地 Apache 服务器上使用 MySQL 数据库对其进行了测试,一切正常。
最近我将 PHP 代码迁移到在线主机 HostGator。我的部分代码在涉及识别 HTTP 请求时停止工作 header。像这样:
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 代码,它读取 header 授权 下的 api-key。它在我的本地服务器上运行良好,但在 HostGator
上迁移相同代码时报告 api-key 丢失我怀疑在我的本地环境中可能有某些默认设置,但需要在 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 请求。
编辑:我检索 header 值的代码:
$headers = apache_request_headers();
if (isset($headers['Authorization'])) {
$api_key = $headers['Authorization'];
// validating api key
// ...
} else {
// api key is missing in header
// ...
}
您没有 post 检索代码 "Authorization" header
我建议您查看接收 PHP 脚本中的 SERVER 变量。
$myauthorization=$_SERVER['HTTP_Authorization'];
那是行不通的。查看可用的内容
print_r($_SERVER);
您正在使用自定义 API 密钥的授权 header。这不是它的意图,Apache 将丢弃无效的授权 header。
我从 Request headers bag is missing Authorization header in Symfony 2?
所以您需要做的是使用实际的自定义 header。 不要使用授权字段,而是将您的密钥发送为
X-Apikey: this_is_my_magic_key_that_put_in_the_header
然后将其检索为
$headers['X-Apikey'];
Apache 不会丢弃它。
注意:header 会在新词上采用驼峰式命名。发送"X-API-KEY"变成"X-Api-Key"所以用上面的格式就可以正常取回了
Authorization 是 RFC 2617 - HTTP Authentication 的一部分,它不能用过的。只需将其重命名为另一个名称即可。