我刚在服务器上实施了 OAuth 。
要进行身份验证,我需要将令牌作为"Header"
作为密钥"Authorization"
传递。
这在本地工作得很好但是当我将此代码部署到我的生产服务器时,因为系统位于beanstalk负载均衡器后面,所以当PHP运行时,我在各个EC2实例上都没有得到任何Headers。
+---------------+ +----------------+
| | | |
+----------> | Load Balancer+---> | EC2 Server |
| | | |
| | | |
+----------+----+ +----------------+
|
| +-----------------+
| | |
| | EC2 Server |
+--------> | |
| |
+-----------------+
我最初在客户端ip上遇到了同样的问题,服务器会让我回到$_SERVER['REMOTE_ADDR']
的负载均衡器ip。我这样做了
if (getenv('HTTP_X_FORWARDED_FOR')) {
$ip_array = explode(",", getenv('HTTP_X_FORWARDED_FOR'));
$_SERVER['REMOTE_ADDR'] = trim($ip_array[0]);
}
在我的index.php上,我尝试了die(var_dump($_SERVER))
。
但我没有看到我发送过的任何标题。
我确实看到 HTTP_X_FORWARDED_FOR , HTTP_X_FORWARDED_PORT , HTTP_X_FORWARDED_PROTO 但与标题无关。
如何在通过beanstalk负载均衡器后获取各个服务器上的标头?
答案 0 :(得分:1)
$_[SERVER]
中返回的内容显然包含一些标题及其值的副本,其中HTTP_
添加到前面,破折号更改为下划线,以及密钥强制转换为全部大写(导线上的标题实际上不区分大小写,但是当您处理关联数组时,需要以规范形式处理密钥)...它可能是所有这些都是为了一个非常好的遗留原因而做的,很少有人会再记得了。
真正的请求标头可以通过getallheaders()
功能访问,至少在你使用Apache网络服务器时是这样。