2

您好我遇到了 Symfony2 无法识别来自 Amazon AWS 的负载均衡器标头的问题,这些标头需要使用requires_channel: https安全配置来确定请求是否为 SSL。

默认情况下 Symfony2 $request->isSecure() 寻找“X_FORWARDED_PROTO”,但显然没有标准,亚马逊 AWS 负载均衡器使用“HTTP_X_FORWARDED_PROTO”。

我看到了在配置中设置受信任代理的食谱文章,但这是针对将特定 IP 地址列入白名单的,不适用于生成动态 IP 的 AWS。另一个功能,将框架配置设置为包含trust_proxy_headers: true已弃用。这通过在仅需要 SSL 的页面上强制进行无休止的重定向来破坏我的应用程序。

4

2 回答 2

2

您现在可以使用setTrustedHeaderName(). 此方法允许您更改整个文件中使用的四个标题。

const HEADER_CLIENT_IP    = 'client_ip'; // defaults 'X_FORWARDED_FOR'
const HEADER_CLIENT_HOST  = 'client_host'; // defaults 'X_FORWARDED_HOST'
const HEADER_CLIENT_PROTO = 'client_proto'; // defaults 'X_FORWARDED_PROTO'
const HEADER_CLIENT_PORT  = 'client_port'; // defaults 'X_FORWARDED_PORT'

上述内容取自 Request 类,表示可用于上述方法的键。

// $request is instance of HttpFoundation\Request;

$request->setTrustedHeaderName('client_proto', 'HTTP_X_FORWARDED_PROTO');

也就是说,在撰写本文时,使用"symfony/http-foundation": "2.5.*"以下代码可以正确确定请求在 AWS 负载均衡器之后是否安全。

// All IPs (*)
// $proxies = [$request->getClientIp()];

// Array of CIDR pools from load balancer
// EC2 -> Network & Security -> Load Balancers
//  -> X -> Instances (tab) -> Availability Zones
//  -> Subnet (column)

$proxies = ['172.x.x.0/20'];

$request->setTrustedProxies($proxies);

var_dump($request->isSecure()); // bool(true)
于 2014-11-19T01:50:16.210 回答
1

没错,X_FORWARDED_PROTO标头被硬编码到HttpFoundation\Request中,而据我所知,目前无法覆盖 symfony 中的请求类。

这里有一个关于这个主题的讨论/RFC,并且有一个开放的pull-request使用RequestFactory.

于 2013-09-04T08:06:32.037 回答