php - constant - Laravel 5.6 TrustedProxies error
fideloper/proxy laravel (4)
Abra la app/Http/Middleware/TrustProxies.php
.
Cambia lo siguiente
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'',
];
a
protected $headers = Request::HEADER_X_FORWARDED_ALL;
Actualicé de L5.5 a L5.6 hoy (actualizando los componentes de Symfony a v4 en el proceso). También he actualizado el paquete fideloper/proxy
a 4.0 a partir de la guía oficial de actualización de Laravel 5.6.
Después de eso, empiezo a recibir este error: Error de 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()
hecho espera un entero (máscara de bits) como un segundo argumento:
/**
* 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;
}
y fideloper/proxy
4.0 es, de hecho, proporciona una matriz en lugar de un entero en esta función:
public function handle(Request $request, Closure $next)
{
$request::setTrustedProxies([], $this->getTrustedHeaderNames()); // Reset trusted proxies between requests
$this->setTrustedProxyIpAddresses($request);
return $next($request);
}
y
/**
* 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'');
}
¿Entonces no puedo entender si esto es un error en fideloper/proxy
o simplemente me estoy perdiendo algo?
Como se indica en la guía de actualización , debe establecer la propiedad $ headers en App / Http / Middleware / TrustProxies en una propiedad de bit.
Las constantes se definen en 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
En la guía de actualización, se usa HEADER_X_FORWARDED_ALL pero puede usar una combinación de los valores de bit.
Después de algunas investigaciones (comparación de Winmerge con una nueva instalación de Laravel 5.6) esto se reduce a una diferencia en los archivos 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, set protected $headers = Request::HEADER_X_FORWARDED_ALL;
según la versión 5.6 de Laravel
Tenga en cuenta también que al actualizar de Laravel 5.5 a 5.6, Laravel crea un nuevo archivo llamado TrustProxies.php con el mismo espacio de nombres que TrustedProxies, es decir, "App/Http/Middleware/TrustProxies"
. En Laravel 5.6, el archivo TrustedProxies.php
es correcto como se mencionó anteriormente.
El TrustProxies.php
no lo es. Pero si ambos existen en el mismo espacio de nombres, Laravel usará el que encuentre primero, y ese es el archivo TrustProxies.php
.
Si tiene ambos, elimine TrustProxies.php
y asegúrese de que TrustedProxies.php
tenga los cambios correctos como se mencionó anteriormente.
Que tengas un día increíble. cristiano