J'ai mis à jour de L5.5 vers L5.6 aujourd'hui (mise à jour des composants Symfony vers v4 dans le processus). J'ai également mis à jour le package fideloper/proxy
Vers la version 4.0 à partir du guide officiel de mise à niveau Laravel 5.6.
Après cela, je commence à obtenir cette erreur: 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\Component\HttpFoundation\Request::setTrustedProxies()
de Symfony 4 attend en effet un entier (bitmask) comme 2ème argument:
/**
* 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;
}
et fideloper/proxy
4.0 donne en effet un tableau au lieu d'un entier dans cette fonction:
public function handle(Request $request, Closure $next)
{
$request::setTrustedProxies([], $this->getTrustedHeaderNames()); // Reset trusted proxies between requests
$this->setTrustedProxyIpAddresses($request);
return $next($request);
}
et
/**
* 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');
}
Je ne peux donc pas comprendre s'il s'agit d'un bogue dans fideloper/proxy
Ou s'il me manque quelque chose?
Comme indiqué dans le guide de mise à nivea , vous devez définir la propriété $ headers dans App\Http\Middleware\TrustProxies sur un propriété de bit.
Les constantes sont définies dans 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
Dans le guide de mise à niveau, HEADER_X_FORWARDED_ALL est utilisé mais vous pouvez utiliser une combinaison des valeurs de bits.
Après quelques recherches (comparaison de Winmerge avec une nouvelle installation de Laravel 5.6), cela revient à une différence dans les fichiers 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, définissez protected $headers = Request::HEADER_X_FORWARDED_ALL;
selon Laravel version 5.6
Ouvrir app\Http\Middleware\TrustProxies.php
.
Modifiez ce qui suit
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;
Veuillez également garder à l'esprit que lors de la mise à niveau de Laravel 5.5 vers 5.6 Laravel crée un nouveau fichier appelé TrustProxies.php avec le même espace de noms que TrustedProxies, c'est-à-dire "App\Http\Middleware\TrustProxies"
. Dans Laravel 5.6, le TrustedProxies.php
le fichier est correct comme mentionné ci-dessus.
Le TrustProxies.php
n'est pas. Mais s'ils existent tous les deux dans le même espace de noms, alors Laravel utilisera celui qu'il trouve en premier, et c'est le TrustProxies.php
fichier.
Si vous disposez des deux, supprimez TrustProxies.php
, et assurez-vous que TrustedProxies.php
a les changements corrects mentionnés ci-dessus.
Passez une bonne journée. Christian