Je travaille sur mon premier projet Laravel 5 et je ne sais pas où ni comment placer la logique pour forcer HTTPS sur mon application. Le cliché ici est qu'il existe de nombreux domaines pointant vers l'application et que seuls deux sur trois utilisent SSL (le troisième est un domaine de secours, une longue histoire). Je voudrais donc gérer cela dans la logique de mon application plutôt que dans .htaccess.
Dans Laravel 4.2, j'ai effectué la redirection avec ce code, situé dans filters.php
:
App::before(function($request)
{
if( ! Request::secure())
{
return Redirect::secure(Request::path());
}
});
Je pense que le middleware est l'endroit où quelque chose comme ça devrait être implémenté, mais je ne peux pas vraiment comprendre cela en l'utilisant.
Merci!
METTRE À JOUR
Si vous utilisez Cloudflare comme moi, ceci est accompli en ajoutant une nouvelle règle de page dans votre panneau de contrôle.
la source
$_SERVER['HTTP_HOST']
Réponses:
Vous pouvez le faire fonctionner avec une classe Middleware. Laissez-moi vous donner une idée.
Ensuite, appliquez ce middleware à chaque requête ajoutant la définition de la règle au
Kernel.php
fichier, comme ceci:Dans l'exemple ci-dessus, le middleware redirigera chaque requête vers https si:
production
. Alors, ajustez simplement les paramètres en fonction de vos préférences.Cloudflare
J'utilise ce code dans un environnement de production avec un SSL WildCard et le code fonctionne correctement. Si je supprime
&& App::environment() === 'production'
et le teste dans localhost, la redirection fonctionne également. Donc, avoir ou non un SSL installé n'est pas le problème. Il semble que vous deviez porter une attention toute particulière à votre couche Cloudflare afin d'être redirigé vers le protocole Https.Modifier 23/03/2015
Merci à
@Adam Link
la suggestion de: cela est probablement causé par les en-têtes que Cloudflare passe. CloudFlare frappe probablement votre serveur via HTTP et transmet un en-tête X-Forwarded-Proto qui déclare qu'il transmet une requête HTTPS. Vous devez ajouter une autre ligne dans votre middleware qui dit ...... pour faire confiance aux en-têtes que CloudFlare envoie. Cela arrêtera la boucle de redirection
Edit 27/09/2016 - Laravel v5.3
Il suffit d'ajouter la classe middleware au
web
groupe danskernel.php file
:Edit 23/08/2018 - Laravel v5.7
App::environment() === 'production'
. Pour la version précédente étaitenv('APP_ENV') === 'production'
.\URL::forceScheme('https');
en fait ne redirige pas. Il crée simplement des liens avechttps://
une fois le site Web rendu.la source
$request->setTrustedProxies( [ $request->getClientIp() ] );
faire confiance aux en-têtes que CloudFlare envoie. Cela arrêtera la boucle de redirection.return redirect()->secure($request->getRequestUri(), 301);
$request->server('HTTP_X_FORWARDED_PROTO') != 'https'
cela fonctionne pour moiUne autre option qui a fonctionné pour moi, dans AppServiceProvider, placez ce code dans la méthode de démarrage:
La fonction écrite avant forceSchema ('https') était fausse, son forceScheme
la source
\URL::forceScheme('https');
if($this->app->environment() === 'production'){ $this->app['request']->server->set('HTTPS', true); }
\URL::forceScheme('https')
Sinon, si vous utilisez Apache, vous pouvez utiliser un
.htaccess
fichier pour forcer vos URL à utiliser lehttps
préfixe. Sur Laravel 5.4, j'ai ajouté les lignes suivantes à mon.htaccess
fichier et cela a fonctionné pour moi.la source
RewriteCond %{HTTP_HOST} !=localhost
sur dev pour contourner ce problème .pour laravel 5.4 utilisez ce format pour obtenir une redirection https au lieu de .htaccess
la source
Similaire à la réponse de manix mais en un seul endroit. Middleware pour forcer HTTPS
la source
Ceci est pour Larave 5.2.x et supérieur. Si vous souhaitez avoir la possibilité de diffuser du contenu via HTTPS et d'autres via HTTP, voici une solution qui a fonctionné pour moi. Vous vous demandez peut-être pourquoi quelqu'un voudrait-il diffuser uniquement du contenu via HTTPS? Pourquoi ne pas tout servir via HTTPS?
Bien qu'il soit tout à fait correct de desservir l'ensemble du site via HTTPS, tout interrompre via HTTPS entraîne une surcharge supplémentaire sur votre serveur. N'oubliez pas que le cryptage n'est pas bon marché. La légère surcharge a également un impact sur le temps de réponse de votre application. Vous pourriez soutenir que le matériel de base est bon marché et que l'impact est négligeable, mais je m'éloigne du sujet :) Je n'aime pas l'idée de proposer du contenu marketing de grandes pages avec des images, etc. Alors voilà. C'est similaire à ce que d'autres ont suggéré ci-dessus en utilisant un middleware, mais c'est une solution complète qui vous permet de basculer entre HTTP / HTTPS.
Créez d'abord un middleware.
Voici à quoi devrait ressembler votre middleware.
Notez que je ne filtre pas en fonction de l'environnement car j'ai une configuration HTTPS pour le développement local et la production, donc ce n'est pas nécessaire.
Ajoutez ce qui suit à votre routeMiddleware \ App \ Http \ Kernel.php afin de pouvoir choisir le groupe de routage qui doit forcer SSL.
Ensuite, je voudrais sécuriser deux groupes de base, connexion / inscription, etc. et tout le reste derrière le middleware Auth.
Confirmez que vos middlewares sont correctement appliqués à vos routes depuis la console.
Maintenant que vous avez sécurisé tous les formulaires ou zones sensibles de votre application, la clé est maintenant d'utiliser votre modèle de vue pour définir vos liens sécurisés et publics (non https).
Sur la base de l'exemple ci-dessus, vous rendriez vos liens sécurisés comme suit -
Les liens non sécurisés peuvent être rendus comme
Cela rend une URL complète telle que https: // yourhost / login et http: // yourhost / aboutus
Si vous ne rendiez pas une URL entièrement qualifiée avec http et que vous utilisiez une URL de lien relative ('/ aboutus'), https persisterait après qu'un utilisateur ait visité un site sécurisé.
J'espère que cela t'aides!
la source
Qu'en est-il simplement d'utiliser le fichier .htaccess pour obtenir une redirection https? Cela doit être placé à la racine du projet (pas dans le dossier public). Votre serveur doit être configuré pour pointer vers le répertoire racine du projet.
J'utilise ceci pour laravel 5.4 (dernière version au moment de la rédaction de cette réponse) mais cela devrait continuer à fonctionner pour les versions de fonctionnalités même si laravel change ou supprime certaines fonctionnalités.
la source
RewriteCond %{HTTP_HOST} productiondomain\.com$ [NC]
Vous pouvez utiliser RewriteRule pour forcer ssl dans le même dossier .htaccess avec votre index.php
Veuillez ajouter en tant que pièce jointe d'image, l'ajouter avant toutes les règles autres
la source
dans IndexController.php mettre
dans AppServiceProvider.php mettre
}
Dans AppServiceProvider.php, chaque redirection sera dirigée vers l'url https et pour la requête http, nous avons besoin d'une redirection une fois, donc dans IndexController.php Il suffit de faire une redirection
la source
Les réponses ci-dessus n'ont pas fonctionné pour moi, mais il semble que Deniz Turan a réécrit le .htaccess d'une manière qui fonctionne avec l'équilibreur de charge de Heroku ici: https://www.jcore.com/2017/01/29/force-https -on-heroku-using-htaccess /
la source
J'ajoute cette alternative car j'ai beaucoup souffert de ce problème. J'ai essayé toutes les manières différentes et rien n'a fonctionné. Donc, j'ai trouvé une solution de contournement pour cela. Ce n'est peut-être pas la meilleure solution, mais cela fonctionne -
production <- Il doit être remplacé par la valeur APP_ENV dans votre fichier .env
la source
Voici comment le faire sur Heroku
Pour forcer SSL sur vos dynos mais pas localement, ajoutez à la fin de votre .htaccess en public /:
Vous pouvez tester ceci sur votre machine locale avec:
Cela définit l'en-tête X-transmis à la forme qu'il prendra sur heroku.
c'est-à-dire qu'il simule la façon dont un dyno heroku verra une requête.
Vous obtiendrez cette réponse sur votre ordinateur local:
C'est une redirection. C'est ce que heroku va rendre à un client si vous définissez le .htaccess comme ci-dessus. Mais cela ne se produit pas sur votre machine locale car X-forwarded ne sera pas défini (nous l'avons simulé avec curl ci-dessus pour voir ce qui se passait).
la source
Si vous utilisez CloudFlare, vous pouvez simplement créer une règle de page pour toujours utiliser HTTPS: cela redirigera chaque requête http: // vers https: //
En plus de cela, vous devrez également ajouter quelque chose comme ceci à votre fonction boot () \ app \ Providers \ AppServiceProvider.php:
Cela garantirait que chaque lien / chemin de votre application utilise https: // au lieu de http: //.
la source
Une approche un peu différente, testée dans Laravel 5.7
PS. Code mis à jour en fonction des commentaires de @ matthias-lill.
la source
config('app.url')
place. En outre, Laravel est livré avec une fonction de chaîne très pratiqueStr::startsWith(config('app.url'), 'https://')
.Pour Laravel 5.6, j'ai dû changer un peu de condition pour que cela fonctionne.
de:
À:
la source
Cela a fonctionné pour moi. J'ai créé un code php personnalisé pour forcer le redirection vers https. Incluez simplement ce code dans le header.php
la source
J'utilise dans Laravel 5.6.28 prochain middleware:
la source
Le moyen le plus simple serait au niveau de l'application. Dans le fichier
ajoutez ce qui suit:
et dans la méthode boot (), ajoutez ce qui suit:
Cela devrait rediriger toutes les demandes vers https au niveau de l'application.
(Remarque: ceci a été testé avec laravel 5.5 LTS)
la source
Vous pouvez simplement accéder à l' application -> Fournisseurs -> AppServiceProvider.php
ajouter deux lignes
utilisez Illuminate \ Support \ Facades \ URL;
URL :: forceScheme ('https');
comme indiqué dans les codes suivants:
la source
Ce travail pour moi dans Laravel 7.x en 3 étapes simples aide d'un middleware:
1) Générez le middleware avec la commande
php artisan make:middleware ForceSSL
Intergiciel
2) Enregistrez le middleware dans le
routeMiddleware
fichier du noyauNoyau
3) Utilisez-le dans vos itinéraires
Itinéraires
ici la documentation complète sur les middlewares
=========================
.HTACCESS, méthode
Si vous préférez utiliser un
.htaccess
fichier, vous pouvez utiliser le code suivant:Cordialement!
la source