感谢你来到这里
我真的很激动
盼望,能有你的支持
捐赠可扫描二维码转账支付
支付宝扫一扫付款
微信扫一扫付款
(微信为保护隐私,不显示你的昵称)
如果你用的是完整版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不要相信这些“未被过滤”的头(见下文)。
默认时,以下proxy headers受到信任:
Forwarded
用于getClientIp()
;
X-Forwarded-For
用于getClientIp()
;
X-Forwarded-Host
用于getHost()
;
X-Forwarded-Port
用于getPort()
;
X-Forwarded-Proto
用于getScheme()
和isSecure()
如果你的反向代理使用了一个与上面这些都不相同的头名称,你可以通过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 创作共用授权。