Laravel 5 - redirection vers HTTPS
À travailler sur mon premier Laravel 5 projet et vous ne savez pas où ou comment passer de la logique de la force HTTPS sur mon application. Le facteur décisif ici est qu'il ya beaucoup de domaines pointant vers l'application et seulement deux sur trois utilisent le protocole SSL (le troisième est un repli de domaine, c'est une longue histoire). Donc, je tiens à les traiter dans mon application logique plutôt que .htaccess.
Dans Laravel 4.2 j'ai fait la redirection avec ce code, situé dans filters.php
:
App::before(function($request)
{
if( ! Request::secure())
{
return Redirect::secure(Request::path());
}
});
Je pense Middleware est où quelque chose comme cela devrait être mis en œuvre, mais je ne peux pas tout à fait le comprendre à l'aide.
Merci!
Mise à JOUR
Si vous utilisez Cloudflare comme je suis, ceci est réalisé par l'ajout d'une nouvelle Règle de mise en Page dans votre panneau de contrôle.
- Donc ce qui se passe avec le 3ème domaine? Si vous forcez le https sur toutes les routes - la 3ème domaine continuer à travailler?
- Détecter qu'avec
$_SERVER['HTTP_HOST']
- Combien de temps cela prend-il pour cloudflare règle de mise en page pour prendre effet
- Oh j'ai eu à passer sur le proxy dans les paramètres DNS haha!
Vous devez vous connecter pour publier un commentaire.
Vous pouvez le faire fonctionne avec un Middleware de classe. Permettez-moi de vous donner une idée.
Ensuite, appliquez ce middleware à chaque demande d'ajout de réglage de la règle à
Kernel.php
fichier, comme ceci:À l'exemple ci-dessus, le middleware pour rediriger toutes les demandes de https si:
production
. Donc, il suffit de régler les paramètres selon vos préférences.Cloudflare
Je suis en utilisant ce code dans l'environnement de production avec un WildCard SSL et le code fonctionne correctement. Si je supprime
&& App::environment() === 'production'
et de le tester dans localhost, la redirection fonctionne également. Ainsi, après avoir ou non un installé le SSL n'est pas le problème. On dirait que vous devez garder un très dur attention à votre Cloudflare couche pour être redirigé vers le protocole Https.Modifier 23/03/2015
Grâce à
@Adam Link
suggestion: il est probablement causée par les en-têtes que Cloudflare est de passage. CloudFlare probablement atteint votre serveur via HTTP et passe un X-Forwarded-Proto-tête qui déclare qu'il est de la transmission d'une requête HTTPS. Vous avez besoin d'ajouter une autre ligne dans votre Middleware de dire......confiance en la les en-têtes de CloudFlare est de l'envoi. Cela va arrêter la redirection en boucle
Modifier 27/09/2016 - Laravel v5.3
Suffit d'ajouter le middleware de la classe en
web
groupe danskernel.php file
:Modifier 23/08/2018 - Laravel v5.7
App::environment() === 'production'
. Pour la version précédente a étéenv('APP_ENV') === 'production'
.\URL::forceScheme('https');
ne fait pas de redirection. Il vient établit des liens avechttps://
une fois que le site est rendu.$request->isSecure()
renvoie toujours false, même quand je suis connecté via httpsisSecure()
vérifier?http
àhttps
dans votre application fonctionne réellement. Même, essayez ce code dans votre localhost machine (où le cloudflare couche n'est pas présentée) et vous loook que la redirection fonctionne comme prévu.$request->setTrustedProxies( [ $request->getClientIp() ] );
confiance en la les en-têtes de CloudFlare est de l'envoi. Cela va arrêter la redirection en boucle.return redirect()->secure($request->getRequestUri(), 301);
$request->server('HTTP_X_FORWARDED_PROTO') != 'https'
cela fonctionne pour moi!
avant$request->secure()
n'est pas juste que nous sommes à la vérification de la demande est sécurisé et nous sommes dans un environnement de production. Est ce que le droit?$request-> getRequestUri()
semble saisir la dernière partie de "//uri", de sorte qu'il peut entraîner une attaque de phishing! Par exemple, si l'url esthttp://yourdomain.com//phishingdomain.com
, ce code va rediriger l'utilisateur de votre retour àhttps://phishingdomain.com
Une autre option qui a fonctionné pour moi, en AppServiceProvider placez ce code dans la méthode de démarrage:
La fonction écrite avant forceScheme('https') était erronée, ses forceScheme
\URL::forceScheme('https');
if($this->app->environment() === 'production'){ $this->app['request']->server->set('HTTPS', true); }
\URL::forceScheme('https')
Alternativement, Si vous utilisez Apache, vous pouvez utiliser
.htaccess
fichier pour l'exécution de votre Url à utiliserhttps
préfixe. Sur Laravel 5.4, j'ai ajouté les lignes suivantes dans mon.htaccess
fichier et il a travaillé pour moi.RewriteCond %{HTTP_HOST} !=localhost
sur dev de contourner ce problème.pour laravel 5.4 utiliser ce format pour obtenir redirection https au lieu de .htaccess
Similaire à manix la réponse, mais dans un seul endroit. Middleware pour forcer HTTPS
C'est pour Larave 5.2.x et plus. Si vous voulez avoir une option pour servir de certains contenus sur HTTPS et d'autres sur HTTP, voici une solution qui a fonctionné pour moi. Vous pouvez vous demander pourquoi quelqu'un voudrait de ne servir que certains contenus sur HTTPS? Pourquoi ne pas servir le tout sur HTTPS?
Bien que, il est tout à fait bien pour servir l'ensemble du site via le protocole HTTPS, de couper tout sur HTTPS a une charge supplémentaire sur votre serveur. Souvenez-vous de chiffrement ne vient pas pas cher. La légère surcharge a également un impact sur votre application temps de réponse. On pourrait dire que le matériel est bon marché et l'impact est négligeable, mais je m'égare 🙂 je n'aime pas l'idée de servir de marketing de contenu big pages avec des images, etc via le protocole https. Donc, ici, il va. C'est similaire à ce que d'autres ont suggèrent ci-dessus à l'aide du middleware, mais c'est une solution complète qui vous permet de basculer d'avant en arrière entre les protocoles HTTP/HTTPS.
D'abord créer un middleware.
C'est ce que votre middleware devrait ressembler.
Remarque que je ne suis pas le filtrage basé sur l'environnement parce que j'ai HTTPS programme d'installation pour les deux locaux de développement et de production, donc il n'y a pas besoin d'.
Ajouter les éléments suivants à votre routeMiddleware \App\Http\Kernel.php de sorte que vous pouvez choisir l'itinéraire le groupe devrait forcer SSL.
Prochaine, je voudrais réserver deux groupes de base de connexion/inscription etc et tout le reste derrière Auth middleware.
Confirmer que votre middlewares sont appliqués à vos itinéraires correctement à partir de la console.
Maintenant que vous avez obtenu toutes les formes ou les zones sensibles de votre demande, l'essentiel maintenant est d'utiliser votre modèle de vue de définir vos sécurisé et public (non https) des liens.
Basé sur l'exemple ci-dessus, vous rendrait vos liens sécurisés comme suit -
Non sécurisé liens peuvent être rendus que
Ce que ce n'est rend une URL complète comme https://yourhost/login et http://yourhost/aboutus
Si vous n'étiez pas rendu URL complet avec http et utiliser un lien relatif url('/aboutus'), alors https serait persiste après qu'un utilisateur visite un site sécurisé.
Espérons que cette aide!
Qu'en utilisant simplement .htaccess fichier pour obtenir https rediriger? Cela doit être placé dans la racine du projet (pas dans un dossier public). Votre serveur doit être configuré pour pointer au répertoire racine du projet.
- Je l'utiliser pour laravel 5.4 (dernière version en date de rédaction de cette réponse), mais il doit continuer à travailler pour la fonction des versions, même si laravel modifier ou de supprimer de certaines fonctionnalités.
RewriteCond %{HTTP_HOST} productiondomain\.com$ [NC]
Vous pouvez utiliser des règles de réécriture pour forcer le ssl dans .htaccess même dossier avec votre index.php
S'il vous plaît ajouter la photo à joindre, ajouter avant de règle de tous les autres
dans IndexController.php mettre
dans AppServiceProvider.php mettre
}
Dans AppServiceProvider.php chaque redirection sera aller à l'url https et http demande, nous devons une fois de redirection
donc, en IndexController.php Simplement nous avons besoin de le faire une fois de redirection
Les réponses ci-dessus ne fonctionne pas pour moi, mais il semble que Deniz Turan a réécrit l' .htaccess dans une manière qui fonctionne avec Heroku de l'équilibreur de charge ici:
https://www.jcore.com/2017/01/29/force-https-on-heroku-using-htaccess/
Voici comment le faire sur Heroku
À force de SSL sur votre dynamomètres, mais pas localement, ajouter à la fin de votre .htaccess dans/public:
Vous pouvez la tester en local sur votre machine avec:
Qui définit l'en-tête X-forwarded à la forme qu'il prendra sur heroku.
c'est à dire qu'il simule la façon dont une heroku dyno verrez une demande.
Vous aurez cette réponse sur votre machine locale:
Qui est une redirection. C'est ce que heroku est va donner en retour à un client si vous définissez la .htaccess comme ci-dessus. Mais il ne se passe pas sur votre machine locale, car X-forwarded de ne pas être ensemble (nous truqué avec curl ci-dessus pour voir ce qui se passait).
Pour Laravel 5.6, j'ai dû changer de condition un peu pour le faire fonctionner.
à partir de:
À:
Cela a fonctionné pour moi.
J'ai fait un code php personnalisé à force de le rediriger vers https.
Il suffit d'inclure ce code sur le header.php
Si vous êtes à l'aide de CloudFlare, vous pouvez simplement créer une Règle de mise en Page à toujours utiliser le protocole HTTPS:
Ceci va rediriger tous les http://demande à l'adresse https://
En outre, vous devez également avoir à ajouter quelque chose comme ceci à votre \app\Providers\AppServiceProvider.php de démarrage() fonction:
Cela permettrait de s'assurer que tous les liens /chemin d'accès à votre application à l'aide de https://au lieu de http://.
Je suis en ajoutant ce alternative que j'ai beaucoup souffert de ce problème. J'ai essayé de toutes les manières différentes et rien n'a fonctionné. Donc, je suis venu avec une solution de contournement pour elle. Il pourrait ne pas être la meilleure solution, mais il ne fonctionne -
production <- Il doit être remplacé par le APP_ENV valeur dans votre .fichier env
Je suis aide dans Laravel 5.6.28 prochaine middleware:
Le plus simple serait au niveau de l'application. Dans le fichier
ajouter les éléments suivants:
et dans le coffre() permet d'ajouter les éléments suivants:
Cela devrait rediriger toutes les demande à https au niveau de l'application.
( Note: cela a été testé avec laravel 5.5 LTS )
Un peu différente de l'approche, testé dans Laravel 5.7