Trusting Proxies

3.4 版本
维护中的版本

如果你用的是完整版Symfony框架,应该先阅读如何配置Symfony才能让它在负载均衡和反向代理背后工作

如果你发现自己在某些代理的后面——比如负载均衡——那么使用了特殊的X-Forwarded-*头或者Fowarded头的header信息会被发送给你。例如,Host HTTP头通常用于返回被请求主机。但当你处在代理(proxy)背后时,你应该手动给出代理的“白名单”:

1
2
3
4
5
use Symfony\Component\HttpFoundation\Request;
 
// only trust proxy headers coming from this IP addresses
// 只有受信任的代理headers才会出现在下面的IP地址列表中
Request::setTrustedProxies(array('192.0.0.1', '10.0.0.0/8'));

你应当确保代理(proxy)过滤掉对这些头“未经授权”的使用,即,如果一个代理原生地使用X-Forwarded-For头,它不应该让客户端发送Forwarded头到Symfony。

如果你的代理没有正确地过滤头信息,你应该配置Symfony不要相信这些“未被过滤”的头(见下文)。

配置Header名称 

默认时,以下proxy headers受到信任:

如果你的反向代理使用了一个与上面这些都不相同的头名称,你可以通过setTrustedHeaderName()方法来配置那个头名称:

1
2
3
4
5
Request::setTrustedHeaderName(Request::HEADER_FORWARDED, 'X-Forwarded');
Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, 'X-Proxy-For');
Request::setTrustedHeaderName(Request::HEADER_CLIENT_HOST, 'X-Proxy-Host');
Request::setTrustedHeaderName(Request::HEADER_CLIENT_PORT, 'X-Proxy-Port');
Request::setTrustedHeaderName(Request::HEADER_CLIENT_PROTO, 'X-Proxy-Proto');

对特定的头不予信任 

默认情况是,如果你把自己的代理的IP地址放到了白名单,那么上面五个头是受信任的。如果你需要信任其中的某几个而非其余的,也可以做到:

1
2
3
// disables trusting the ``Forwarded`` header
// 禁止信任 Forwarded 头
Request::setTrustedHeaderName(Request::HEADER_FORWARDED, null);

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)