route - Laravel genera un URL https seguro desde la ruta
storage_path laravel 5 (11)
Realmente no puedo encontrar una manera de generar una URL segura desde el nombre de la ruta.
Para obtener una URL completa, uso
echo route(''my_route_name'');
¿Pero qué hacer, si quiero una URL con https?
Coloca esto en tu archivo filters.php y en todas partes se verán obligados a https manteniendo los parámetros de URL:
//force ssl
App::before(function () {
if(!Request::secure() && App::environment() != ''local'')
{
$baseHost = Request::getHttpHost();
$requestUri = Request::getRequestUri();
$newLink = ''https://''.$baseHost.$requestUri;
return Redirect::to($newLink);
}});
Como mencioné en una pregunta relevante , encontré 5 formas de generar URL seguras.
Configure su servidor web para redirigir todas las solicitudes no seguras a https. Ejemplo de una configuración nginx:
server { listen 80 default_server; listen [::]:80 default_server; server_name example.com www.example.com; return 301 https://example.com$request_uri; }
Configure su variable de entorno
APP_URL
usando https:APP_URL=https://example.com
Use helper secure_url() (Laravel5.6)
Agregue la siguiente cadena al método AppServiceProvider :: boot () (para la versión 5.4+):
/Illuminate/Support/Facades/URL::forceScheme(''https'');
Establecer implícitamente el esquema para el grupo de ruta (Laravel5.6):
Route::group([''scheme'' => ''https''], function () { // Route::get(...)->name(...); });
Por el momento esta forma no está documentada, pero funciona bien.
Creo que solo hay una manera de hacer esto.
Para generar la URL segura a sus rutas con nombre, es posible que desee pasar su ruta a la función de ayudante secure_url
.
secure_url(URL::route(''your_route_name'', [], false));
Realmente no puede usar la función de ayuda de route
porque genera la URL absoluta (con http://
) de forma predeterminada y es http
no la versión https
que deseaba
En la mayoría de los casos, las rutas deben generarse con el mismo esquema con el que se cargó su sitio. Laravel detecta automáticamente si la solicitud tiene X-Forwarded-Proto
encabezado X-Forwarded-Proto
y lo utiliza para decidir qué esquema usar en las URL de ruta generadas. Si su sitio está detrás de proxy inverso, debe agregar una dirección IP de proxy inverso a la lista de proxies de confianza. https://github.com/fideloper/TrustedProxy paquete https://github.com/fideloper/TrustedProxy ayuda a hacer esto. Está included en Laravel 5.5. Por ejemplo, mi config/trustedproxy.php
ve así:
<?php
return [
''proxies'' => ''*'',
''headers'' => [
]
];
Lo uso con el proxy inverso nginx que tiene la siguiente configuración:
server {
listen 80;
server_name example.com;
access_log /var/log/nginx/example.com_access.log;
error_log /var/log/nginx/example.com_error.log;
client_max_body_size 50m;
location / {
proxy_pass http://localhost:8002;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
}
Reemplaza example.com
con tu dominio. Los certificados SSL fueron proporcionados por Let''s Encrypt con certbot .
Encontré este problema al intentar generar una ruta como acción de formulario en Blade usando Laravel 5.4. Entonces golpeé en secure_url (), así que intenté
{{ secure_url(route(''routename'', $args)) }}
Esto todavía devolvió una URL no segura. :-(
Después de revisar el código y agregar algunos registros de depuración, finalmente descubrí que secure_url no cambia el argumento de URL entrante, si ya es una URL absoluta (incluido el esquema).
Afortunadamente, route tiene una marca absoluta como tercer argumento y devuelve una URL relativa si $ absolute se pasa como falso.
Suponiendo que / a / {id} / b es una ruta con nombre "ab"
route(''a.b'', 1) : will return http://[domain]/a/1/b
route(''a.b'', 1, false) : will return /a/1/b
Uniéndome a los dos llegué a:
{{ secure_url(route(''routename'', $args, false)) }}
Como era de esperar, generó https://[domain]/routeXXX
:-)
Laravel 5.x generará una URL segura a través de la ayuda de route () si detecta que la conexión entrante es segura. El problema suele ocurrir si la aplicación está oculta detrás del equilibrador de carga o el proxy (por ejemplo, Cloudflare), ya que la conexión entre el servidor de la aplicación y el equilibrador de carga / proxy puede no ser segura.
Estoy usando Laravel Forge + Cloudflare ahora y esta es la forma más fácil que puedo encontrar para habilitar la aplicación. La conexión entrante es segura (no estoy seguro acerca de otro proxy).
Genere un certificado autofirmado (consulte https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs o http://www.selfsignedcertificate.com/ )
En el panel de Forge, inserte su clave privada y
Sites > your-site > SSL Certificates > Install Existing Certificate
través deSites > your-site > SSL Certificates > Install Existing Certificate
.Activar
En el panel de CloudFlare,
Crypto > SSL
, seleccione "Completo" (no estricto)- Hecho (el cambio tardará unos minutos en propagarse)
En resumen, la conexión entre el cliente y Cloudflare está protegida por el propio SSL de Cloudflare. La conexión entre el servidor de aplicaciones y Cloudflare está protegida a través de su certificado generado (por lo tanto, la aplicación considera que la conexión es segura).
Puedes aplicar el mismo principio con otras pilas.
Para generar una ruta segura (https) use el siguiente ''filtro'' llamado ''auth'': ''incorporado'':
Por ejemplo:
Route::get(''your-route'', [''before'' => ''auth'', ''uses'' => YourController@yourAction'']);
Ahora, cuando emita su enlace, se añadirá ''https''
Para referencia de futuros visitantes:
La función secure_url no maneja correctamente los parámetros GET. Entonces, por ejemplo, si desea convertir la url que el usuario ha visitado en una url segura mientras conserva los campos GET, necesita usar esto:
secure_url(Request::path()).''?''.http_build_query(Input::all());
En particular, tenga en cuenta el uso de path () en lugar de url (): si le asigna una url completa, no reemplaza el http al principio, lo que lo hace inútil.
Resulta que a laravel no le importa si la url es segura o no, porque se genera basándose en la url actual. Si estás en la página https, route()
devolverá la URL segura. Si está en http, entonces http://
url
El problema era que Laravel no detectó que https estaba habilitado, debido a una configuración de servidor defectuosa.
Puede verificar si Laravel ve la conexión actual como https llamando a Request::isSecure();
Utilice secure_url:
secure_url(URL::route(''your_route_name'', [], false));
Necesitará establecer URL :: route en false para no devolver una URL completa. Luego, la función utilizar secure_url genera una URL HTTPS completamente calificada para la ruta dada.
Desde la interfaz de UrlGenerator puedes usar URL :: route
string route(string $name, mixed $parameters = array(), bool $absolute = true)
Get the URL to a named route.
Parameters
string $name
mixed $parameters
bool $absolute
Return Value
string
https://laravel.com/api/5.4/Illuminate/Contracts/Routing/UrlGenerator.html
ACTUALIZACIÓN: Como se señaló en los comentarios, una forma más sencilla de hacerlo sería agregar URL::forceSchema(''https'');
para la versión de Laravel entre 4.2-5.3 o URL::forceScheme(''https'');
para la versión 5.4+ en el método de boot
de su archivo AppServiceProvider
.
Respuesta antigua:
En realidad, es completamente posible y solo se necesita una línea de código para lograrlo.
Laravel no comprueba la presencia de SSL por sí misma, depende de Symfony. Y ahí va nuestra clave para hacerle creer que la solicitud actual es segura.
La cuestión es que tenemos que establecer el HTTPS
server param
HTTPS
en verdadero y el método más sencillo es pegar el siguiente código en el método de boot
de su AppServiceProvider
:
$this->app[''request'']->server->set(''HTTPS'', true);
En mi caso, solo necesito forzar SSL en la producción, el env local todavía debería funcionar en http. Así es como fuerzo SSL solo en producción:
$this->app[''request'']->server->set(''HTTPS'', $this->app->environment() != ''local'');
Por cierto, tenga en cuenta estos términos, puede que los necesite en el futuro.