我遇到了一个非常奇怪的问题。
我使用postman发送HTTP请求,用于在PHP中编写的一些休息服务。我一直在我的开发服务器上测试它没有任何问题。然后就可以进入生产服务器了。部署后,我注意到我无法进行身份验证。我通过SSL使用基本HTTP身份验证。
在深入研究之后,我注意到标题没有达到我的代码。 var_dump(apache_request_headers()),没有显示"授权"标题,但后来我启用了mod_forensic,并记录了相同的请求。标头是在forensic_log中设置的,但是没有在php标头中设置。
我在Cpanel / WHM,Apache / 2.4.9,PHP 5.5.10。还在同一台服务器上使用Apache 2.2.x和php 5.4.x进行了测试。
有一份请求的副本:
+Uyw0q60sJjwAAFodDcIAAAAC|GET /pt_BR/webservice/product HTTP/1.1|Host:www.website.com.br|Connection:keep-alive|User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36|Cache-Control:no-cache|Content-Type:application/json|Authorization:Basic Zmhjc0BsaXZlLmNvbTo2NzY2MTI1NTEzNjcxOTQxMjEzNjgxMDcxMDg2MDcwNA==|Postman-Token:e87e4305-08b8-6868-69d6-9132ff741f6f|Accept:*/*|Accept-Encoding:gzip,deflate,sdch|Accept-Language:en-US,en;q=0.8,pt-BR;q=0.6,pt;q=0.4
和var_dump(apache_request_headers()):
array(10) {
["Content-Type"]=>
string(16) "application/json"
["Accept"]=>
string(3) "*/*"
["Accept-Encoding"]=>
string(17) "gzip,deflate,sdch"
["Accept-Language"]=>
string(35) "en-US,en;q=0.8,pt-BR;q=0.6,pt;q=0.4"
["Cache-Control"]=>
string(8) "no-cache"
["Connection"]=>
string(10) "keep-alive"
["Cookie"]=>
string(42) "PHPSESSID=a00f255f7e96b25f34f84670fbb8362e"
["Host"]=>
string(21) "www.website.com.br"
["Postman-Token"]=>
string(36) "b1d04f7f-89b3-e7fd-3841-9850f5ff1916"
["User-Agent"]=>
string(105) "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36"
}
答案 0 :(得分:3)
也许你的生产服务器正在运行PHP作为FastCGI?
引用German hoster的FAQ页面,在这种情况下命名相关的http变量存在不一致。
这个mod_rewrite规则应该解决这个问题:
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
如果您将PHP作为apache2模块运行,则无效。