问题所在(译注:小编就遇到了)

如果你把现有的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。