Je veux créer une règle dans nginx qui fait deux choses:
- Supprime le "www." à partir de l'URI de la demande
- Redirige vers "https" si l'URI de la requête est "http"
Il existe de nombreux exemples sur la manière de faire chacune de ces choses individuellement, mais je ne peux pas trouver de solution qui fasse les deux correctement (c’est-à-dire qu’il ne crée pas de boucle de redirection et gère correctement tous les cas).
Il doit gérer tous ces cas:
1. http://www.example.com/path
2. https://www.example.com/path
3. http://example.com/path
4. https://example.com/path
Celles-ci devraient toutes se terminer sur https://example.com/path (# 4) sans faire de boucle. Des idées?
Réponses:
Pour ce faire, la meilleure solution consiste à utiliser trois blocs de serveur: un pour rediriger http vers https, un pour rediriger le https www-name vers no-www et un pour gérer les demandes. La raison d'utiliser des blocs de serveur supplémentaires au lieu de ifs est que la sélection du serveur est effectuée à l'aide d'une table de hachage et est très rapide. Utiliser un niveau de serveur if signifie que if est exécuté pour chaque demande, ce qui est une perte de temps. Aussi, capturer l'URI demandé dans la réécriture est une perte de temps, car nginx a déjà cette information dans les variables $ uri et $ request_uri (avec et avec la chaîne de requête, respectivement).
la source
https://example.com/
www.sub.example.com
verssub.example.com
et puis obtenir seulement un certificat SSL poursub.example.com
Maintenant, je sais que la vérification SSL cert se produit avant la redirection 301, donc cela ne peut pas fonctionner. Plus d'explications ici: serverfault.com/a/358625/144811Cela fonctionne pour moi:
Gardez à l'esprit que les deux
yourdomain.com
etwww.yourdomain.com
doivent figurer dans votre certificat SSL. Cela est possible avec un certificat générique ou avec un autre nom de serveur, comme expliqué ici . Consultez https://www.startssl.com pour des certificats gratuits et agréables qui le font. ( Edith : à partir de la version 56 de Chrome, les certificats startssl ne seront plus fiables. Essayez plutôt https://letsencrypt.org/ .)la source
include
règle pour l'ajouter aux deux blocs de serveur SSL.Après avoir passé tant de temps avec des centaines de cas similaires, je viens avec l'extrait suivant. C'est court et peut être facilement modifié pour s'adapter à n'importe quoi.
Oui ça peut être. Mais il existe pour une raison et ne devrait pas nuire à ceux qui savent l’utiliser correctement. ;)
la source
Je préfère renvoyer un code de réponse pour que le navigateur sache que vous le redirigez vers une autre URL.
puis un autre bloc de configurations de serveur pour la
https
la source
pourquoi ne pas créer un bloc serveur à cette fin:
puis redémarrer nginx
la source
https://www.example.com
vershttps://example.com
.Je pense que cela devrait fonctionner.
Dans votre définition de serveur HTTP standard, quelque chose comme anthonysomerset est suggéré, à savoir:
Puis sur votre définition de serveur SSL:
De cette manière, la redirection ne devrait avoir lieu qu'une fois par requête, quelle que soit l'URL d'origine de l'utilisateur.
la source
if ($host = 'www.example.com') {
puisque votre regex ne fonctionnait pas pour moi, cependant. Aucune idée pourquoi, car cela semble correct.Voici l'exemple complet qui a fini par travailler pour moi. Le problème était que je n'avais pas les détails ssl (
ssl_certificate
, etc.) dans le bloc de redirection www. N'oubliez pas de vérifier vos journaux (sudo tail -f /var/log/nginx/error.log
)!la source