Laravel 5.6 Ошибка TrustedProxies

Я обновил с L5.5 до L5.6 сегодня (процесс обновления компонентов Symfony до v4). Также я обновил fideloper/proxy Пакет до 4.0 с официального руководства по обновлению Laravel 5.6.

После этого я начинаю получать эту ошибку: 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 4’s Symfony\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/proxy 4.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 или я просто что-то упустил?

19

Решение

Как указано в руководство по обновлению, вам нужно установить свойство $ headers в App \ Http \ Middleware \ TrustProxies немного собственности.

Константы определены в Symfony \ Component \ HttpFoundation \ Запрос.

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, но вы можете использовать комбинацию битовых значений.

11

Другие решения

После некоторого исследования (сравнение 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',
];
}

Ларавел 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

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;
13

Помните также, что при обновлении с 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 имеет правильные изменения, как указано выше.

Удачного дня.
Кристиан

2
По вопросам рекламы [email protected]