28

我今天从 L5.5 升级到了 L5.6(正在将 Symfony 组件更新到 v4)。从官方 Laravel 5.6 升级指南开始,我也将fideloper/proxy包更新到 4.0。

之后,我开始收到此错误:Type error: Argument 2 passed to Symfony\Component\HttpFoundation\Request::setTrustedProxies() must be of the type integer, array given, called in /var/www/html/vendor/fideloper/proxy/src/TrustProxies.php on line 54

Symfony 4Symfony\Component\HttpFoundation\Request::setTrustedProxies()确实期望整数(位掩码)作为第二个参数:

/**
* Sets a list of trusted proxies.
*
* You should only list the reverse proxies that you manage directly.
*
* @param array $proxies          A list of trusted proxies
* @param int   $trustedHeaderSet A bit field of Request::HEADER_*, to set which headers to trust from your proxies
*
* @throws \InvalidArgumentException When $trustedHeaderSet is invalid
*/
public static function setTrustedProxies(array $proxies, int $trustedHeaderSet)
{
    self::$trustedProxies = $proxies;
    self::$trustedHeaderSet = $trustedHeaderSet;
}

fideloper/proxy4.0 确实是给这个函数一个数组而不是一个整数:

public function handle(Request $request, Closure $next)
{
    $request::setTrustedProxies([], $this->getTrustedHeaderNames()); // Reset trusted proxies between requests
    $this->setTrustedProxyIpAddresses($request);
    return $next($request);
}

/**
 * Retrieve trusted header name(s), falling back to defaults if config not set.
 *
 * @return array
 */
protected function getTrustedHeaderNames()
{
    return $this->headers ?: $this->config->get('trustedproxy.headers');
}

所以我不明白这是错误fideloper/proxy还是我只是错过了什么?

4

5 回答 5

32

经过一番调查(Winmerge 与全新安装的 Laravel 5.6 进行比较),这归结为文件的差异app\Http\Middleware\TrustProxies.php

Laravel 5.5:

namespace App\Http\Middleware;

use Illuminate\Http\Request;
use Fideloper\Proxy\TrustProxies as Middleware;

class TrustProxies extends Middleware
{
    /**
     * The trusted proxies for this application.
     *
     * @var array
     */
    protected $proxies;

    /**
     * The current proxy header mappings.
     *
     * @var array
     */
    protected $headers = [
        Request::HEADER_FORWARDED => 'FORWARDED',
        Request::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR',
        Request::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST',
        Request::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT',
        Request::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO',
    ];
}

Laravel 5.6:

namespace App\Http\Middleware;

use Illuminate\Http\Request;
use Fideloper\Proxy\TrustProxies as Middleware;

class TrustProxies extends Middleware
{
    /**
     * The trusted proxies for this application.
     *
     * @var array
     */
    protected $proxies;

    /**
     * The headers that should be used to detect proxies.
     *
     * @var string
     */
    protected $headers = Request::HEADER_X_FORWARDED_ALL;
}

Ergo,protected $headers = Request::HEADER_X_FORWARDED_ALL;按照 Laravel 5.6 版本设置

于 2018-02-08T11:47:54.840 回答
22

打开app\Http\Middleware\TrustProxies.php

更改以下内容

protected $headers = [
    Request::HEADER_FORWARDED => 'FORWARDED',
    Request::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR',
    Request::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST',
    Request::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT',
    Request::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO',
];

protected $headers = Request::HEADER_X_FORWARDED_ALL;
于 2018-02-12T00:28:25.097 回答
13

升级指南中所述,您需要将App\Http\Middleware\TrustProxies中的 $headers 属性设置为位属性。

常量在Symfony\Component\HttpFoundation\Request中定义。

const HEADER_FORWARDED = 0b00001; // When using RFC 7239
const HEADER_X_FORWARDED_FOR = 0b00010;
const HEADER_X_FORWARDED_HOST = 0b00100;
const HEADER_X_FORWARDED_PROTO = 0b01000;
const HEADER_X_FORWARDED_PORT = 0b10000;
const HEADER_X_FORWARDED_ALL = 0b11110; // All "X-Forwarded-*" headers
const HEADER_X_FORWARDED_AWS_ELB = 0b11010; // AWS ELB doesn't send X-Forwarded-Host

在升级指南中,使用了 HEADER_X_FORWARDED_ALL,但您可以使用位值的组合。

于 2018-02-08T11:37:06.307 回答
2

请记住,当从 Laravel 5.5 升级到 5.6 时,Laravel 会创建一个名为 TrustProxies.php 的新文件,其名称空间与 TrustedProxies 相同,即"App\Http\Middleware\TrustProxies". 在 Laravel 5.6 中,TrustedProxies.php文件是正确的,如上所述。不是
TrustProxies.php但是如果它们都存在于同一个命名空间中,那么 Laravel 将使用它首先找到的那个,那就是TrustProxies.php文件。

如果两者都有,请删除TrustProxies.php,并确保TrustedProxies.php具有上述正确更改。

祝你有愉快的一天。基督教

于 2018-06-06T12:27:55.180 回答
0

如果您在 Laravel 9.x 或更高版本中遇到此问题,那是因为 Laravel 已将包合并到核心框架中,不再需要它。

fideloper /TrustedProxy repo 在其自述文件中添加了一条注释,指示不要在 Laravel 9.x 上安装该软件包,而是遵循Laravel 升级指南

你可以在 Laravel 文档中的“受信任的代理”标题下找到升级说明

我发现升级指南中的更改花了我 30 秒才完成!

于 2022-02-16T18:27:20.070 回答