Apache收到了Header,但在php中没有

时间:2014-03-21 14:49:53

标签: php apache http rest cpanel

我遇到了一个非常奇怪的问题。

我使用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"
}

1 个答案:

答案 0 :(得分:3)

也许你的生产服务器正在运行PHP作为FastCGI?

引用German hoster的FAQ页面,在这种情况下命名相关的http变量存在不一致。

这个mod_rewrite规则应该解决这个问题:

RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

如果您将PHP作为apache2模块运行,则无效。