Laravel génère une URL https sécurisée à partir de la route
Je ne peux pas vraiment trouver un moyen de générer une URL sécurisée à partir du nom de la route.
pour obtenir une URL complète, j'utilise
echo route('my_route_name');
Mais Que faire si je veux une URL avec https?
11 réponses
mise à jour: comme indiqué dans les commentaires, une façon plus simple de le faire serait d'ajouter URL::forceSchema('https');
pour la version Laravel entre 4.2-5.3 ou URL::forceScheme('https');
pour la version 5.4+boot
méthode AppServiceProvider
fichier.
ancienne réponse:
c'est en fait tout à fait possible et il n'y a qu'une seule ligne de code nécessaire pour accomplir cela.
Laravel ne vérifie pas la présence de SSL par elle-même, cela dépend de Symfony. Et il y va de notre clé pour faire croire que la demande actuelle est sécurisé.
la chose est, nous devons mettre le HTTPS
server param
true, la méthode la plus simple est de coller le code suivant dans la balise boot
méthode AppServiceProvider
:
$this->app['request']->server->set('HTTPS', true);
dans mon cas précis, je n'ai besoin que de forcer la production de SSL, l'env local devrait quand même travailler sur http. C'est de cette façon-je forcer le SSL uniquement sur la production:
$this->app['request']->server->set('HTTPS', $this->app->environment() != 'local');
au fait, pensez à ces termes, vous pourriez en avoir besoin avenir.
en fait, il s'avère que laravel ne se soucie pas de savoir si url est sécurisée ou non, car il génère en fonction de l'url actuelle. Si vous êtes sur la page https,route()
renvoie une url sécurisée. Si sur http, puis http://
url
le problème, C'est que Laravel n'a pas détecté que https était activé, ce qui était dû à une mauvaise configuration du serveur.
vous pouvez vérifier si Laravel voit la connexion actuelle comme https en appelant Request::isSecure();
je pense qu'il y a une seule façon de le faire.
Pour générer l'URL sécurisée de vos routes nommées, vous pouvez passer votre route dans le secure_url
fonction d'assistance.
secure_url(URL::route('your_route_name', [], false));
Vous ne pouvez pas vraiment utiliser le route
fonction helper car elle génère une URL absolue (avec http://
par défaut, et c'est http
https
la version que tu voulais
Laravel 5.x générera une URL sécurisée via l'Assistant route () s'il détecte que la connexion entrante est sécurisée. Le problème survient généralement si l'application est cachée derrière load balancer ou proxy (par exemple Cloudflare) car la connexion entre le serveur app et load balancer/proxy pourrait ne pas être sécurisée.
J'utilise maintenant Laravel Forge + Cloudflare et c'est la façon la plus facile que j'ai pu trouver pour activer l'application en pensant que la connexion entrante est sécurisée (pas sûr d'autres proxy.)
Générer un certificat auto-signé (voir https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs ou http://www.selfsignedcertificate.com/)
dans le panneau de Forge, insérez votre clé privée et votre certificat via
Sites > your-site > SSL Certificates > Install Existing Certificate
.Activer
Dans CloudFlare panneau,
Crypto > SSL
, choisissez "Plein" (pas strict)- Terminé (il faudra quelques minutes pour que le changement se propage)
en bref, la connexion entre client et Cloudflare est sécurisée par le propre SSL de Cloudflare. La connexion entre le serveur d'app et Cloudflare est protégée via votre cert généré (l'application considère donc la 'connexion' comme sécurisée).
Vous pouvez appliquer le même principe avec les autres piles.
Utiliser secure_url:
secure_url(URL::route('your_route_name', [], false));
vous aurez besoin de définir URL::route to false afin de ne pas retourner une URL complète. Ensuite, la fonction secure_url génère une URL HTTPS entièrement qualifiée pour le chemin donné.
à partir de L'interface du générateur D'URL, vous pouvez utiliser 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
dans la plupart des cas, les routes doivent être générées avec le même schéma que celui avec lequel votre site a été chargé. Laravel détecte automatiquement si request a X-Forwarded-Proto
en-tête et l'utilise pour décider quel schéma utiliser dans les URLs de route générées. Si votre site est derrière le mandataire inversé, alors vous devez ajouter l'adresse IP du mandataire inversé à la liste des mandataires de confiance. https://github.com/fideloper/TrustedProxy paquet d'aide pour ce faire. inclus dans Laravel 5.5. Par exemple, mon config/trustedproxy.php
regarde comme:
<?php
return [
'proxies' => '*',
'headers' => [
]
];
je l'utilise avec nginx reverse proxy qui a la configuration suivante:
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;
}
}
Remplacer example.com
avec votre domaine. Les certificats SSL ont été fournis par Let's Encrypt certbot.
Comme je l'ai mentionné dans un question pertinente, j'ai trouvé 5 façons de générer des URLs sécurisées.
configurer votre serveur web pour rediriger toutes les requêtes non sécurisées vers https. Exemple de configuration nginx:
server { listen 80 default_server; listen [::]:80 default_server; server_name example.com www.example.com; return 301 https://example.com$request_uri; }
Définissez votre variable d'environnement
APP_URL
à l'aide de https:APP_URL=https://example.com
utiliser helper secure_url () (Laravel5.6)--8-->
ajouter la chaîne suivante à AppServiceProvider::initialisation (), méthode (pour la version 5.4+):
\Illuminate\Support\Facades\URL::forceScheme('https');
définir implicitement le schéma du groupe de routes (Laravel5.6):
Route::group(['scheme' => 'https'], function () { // Route::get(...)->name(...); });
à l'heure actuelle, cette méthode n'est pas documentée, mais elle fonctionne bien.
de référence Pour de futurs visiteurs:
la fonction secure_url ne gère pas correctement les paramètres GET. Ainsi, par exemple, si vous voulez convertir les url que l'utilisateur a visité dans une url sécurisée tout en conservant l'OBTENIR champs, vous devez utiliser ceci:
secure_url(Request::path()).'?'.http_build_query(Input::all());
en particulier, notez l'utilisation de path () plutôt que url () - si vous lui donnez une url complète, il ne remplace pas le http au début, ce qui le rend efectivement inutile.
j'ai rencontré ce problème en essayant de générer une route comme forme d'action dans Blade en utilisant Laravel 5.4. Puis j'ai cliqué sur secure_url (), donc j'ai essayé
{{ secure_url(route('routename', $args)) }}
cela renvoie toujours une URL non sécurisée. :-(
après avoir creusé le code et ajouté quelques journaux de débogage, j'ai finalement compris que secure_url ne change pas l'argument d'url entrante, si c'est déjà une URL absolue (y compris le schéma).
heureusement route a un drapeau absolu comme le troisième argument, et renvoie une URL relative si $absolute est passé comme false.
en supposant que /a / {id}/b est une route appelée "A. b
route('a.b', 1) : will return http://[domain]/a/1/b
route('a.b', 1, false) : will return /a/1/b
Joindre les deux je suis arrivé à :
{{ secure_url(route('routename', $args, false)) }}
Comme prévu, il a généré https://[domaine]/routeXXX
: -)
Placer dans vos filtres.le fichier php et partout seront forcés à https tout en conservant les paramètres D'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);
}});
pour générer une route sécurisée (https), utilisez l'option 'avant' filtre appelé 'auth'suivante:
Par exemple:
Route::get('your-route', ['before' => 'auth', 'uses' => YourController@yourAction']);
Maintenant, lorsque vous afficherez votre lien, il sera prepended avec 'https'