在负载均衡器后面访问客户端发送的标头

时间:2015-09-16 17:06:41

标签: php amazon-web-services amazon-ec2 elastic-beanstalk

我刚在服务器上实施了 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负载均衡器后获取各个服务器上的标头?

1 个答案:

答案 0 :(得分:1)

$_[SERVER]中返回的内容显然包含一些标题及其值的副本,其中HTTP_添加到前面,破折号更改为下划线,以及密钥强制转换为全部大写(导线上的标题实际上不区分大小写,但是当您处理关联数组时,需要以规范形式处理密钥)...它可能是所有这些都是为了一个非常好的遗留原因而做的,很少有人会再记得了。

真正的请求标头可以通过getallheaders()功能访问,至少在你使用Apache网络服务器时是这样。