【问题标题】:Accessing client sent headers behind a load balancer在负载均衡器后面访问客户端发送的标头
【发布时间】:2015-12-13 09:32:59
【问题描述】:

我刚刚在我的服务器上实现了 OAuth。 要进行身份验证,我需要将令牌作为 "Header" 作为密钥 "Authorization" 传递。

这在本地工作得很好,但是当我将此代码部署到我的生产服务器时,因为系统位于 beanstalk 负载均衡器后面,当 PHP 运行时,我没有在我的各个 EC2 实例上获得任何标头。

             +---------------+     +----------------+ 
             |               |     |                | 
+----------> |  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_FORHTTP_X_FORWARDED_PORTHTTP_X_FORWARDED_PROTO,但与标头无关。

通过 beanstalk 负载平衡器后,如何在我的各个服务器上获取标头?

【问题讨论】:

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


【解决方案1】:

$_[SERVER] 中返回的内容显然包括 一些 标头及其值的副本,HTTP_ 贴在前面,破折号变为下划线,键被强制为全大写(线路上的标题实际上不区分大小写,但是当您处理关联数组时,您需要规范形式的键)......这可能都是为了一个非常好的方式很少有人记得的遗留原因。

真正的请求标头可以通过getallheaders() 函数访问,至少如果您使用的是 Apache Web 服务器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 2011-12-30
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多