问题所在(译注:小编就遇到了)
如果你把现有的Symfony程序升级到了全新的3.3.0版本,你可能会看到这个报错(取决你的程序配置):
The "framework.trusted_proxies" configuration key has been removed in Symfony 3.3.
解决方案
从你的配置文件中删除 framework.trusted_proxies
选项,并在前端控制器中调用 Request::setTrustedProxies()
方法。
例如,如果你原来的配置是下面这样:
1 2 3 4 | # app/config/config.yml
framework:
# ...
trusted_proxies: [192.0.0.1, 10.0.0.0/8] |
彻底删除 trusted_proxies
选项,然后在 app.php
文件中添加下列代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # web/app.php
// BEFORE / 之前
// ...
$kernel = new AppKernel('prod', false);
Request::setTrustedHeaderName(Request::HEADER_FORWARDED, null);
$request = Request::createFromGlobals();
// ...
// AFTER / 之后
// ...
$kernel = new AppKernel('prod', false);
Request::setTrustedHeaderName(Request::HEADER_FORWARDED, null);
Request::setTrustedProxies(['192.0.0.1', '10.0.0.0/8']);
$request = Request::createFromGlobals();
// ... |
你可以马上做出这种改变,因为它可以同时工作在3.3之前的Symfony版本中。这样你就可以升级程序了。当Symfony
3.3发布时,你可以使用 setTrustedProxies()
方法中第二个新参数来简化上面的过程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # web/app.php
// BEFORE in Symfony 3.2 / Symfony 3.2之前
// ...
$kernel = new AppKernel('prod', false);
Request::setTrustedHeaderName(Request::HEADER_FORWARDED, null);
Request::setTrustedProxies(['192.0.0.1', '10.0.0.0/8']);
$request = Request::createFromGlobals();
// ...
// AFTER in Symfony 3.3 / Symfony 3.3之后
// ...
$kernel = new AppKernel('prod', false);
Request::setTrustedProxies(['192.0.0.1', '10.0.0.0/8'], Request::HEADER_X_FORWARDED_ALL);
$request = Request::createFromGlobals(); |
详细说明
Symfony项目,遵循着一个 backward compatibility policy 向下兼容政策,可以保证你在小版本之间升级 (如,从 2.7 到 2.8 或是从 3.2 到 3.3) 而毋须破坏程序。
此政策的 唯一例外 是,当出于 security issue 安全原因而破坏向下兼容时。这也是本例中的情形。一位Heroku team的成员 向我们报告了这一问题 ,我们能够做出的唯一选择,就是破坏向下兼容。
幸运的是,不兼容问题是很容易修复的,你可以马上行动,让你的程序向上兼容Symfony 3.3。