Je souhaite réécrire toutes les requêtes http sur mon serveur Web en requêtes https. J'ai commencé avec les éléments suivants:
serveur { écoutez 80; emplacement / { réécrire ^ (. *) https: //monsite.com$1 permanent; } ...
Un problème est que cela supprime toute information de sous-domaine (par exemple, node1.mysite.com/folder), comment pourrais-je réécrire ce qui précède pour tout rediriger vers https et maintenir le sous-domaine?
Réponses:
Manière correcte dans les nouvelles versions de nginx
Ma première réponse à cette question était correcte à un moment donné, mais elle s'est transformée en un autre piège - pour rester à jour, merci de vérifier Taxer les pièges de réécriture
J'ai été corrigé par de nombreux utilisateurs SE, le mérite leur revient donc, mais plus important encore, voici le code correct:
la source
$host
au lieu de$server_name
si vous utilisez des sous-domaines.REMARQUE: La meilleure façon de procéder est fournie par https://serverfault.com/a/401632/3641 - mais elle est répétée ici:
Dans le cas le plus simple, votre hôte sera désigné comme étant le service auquel vous souhaitez les envoyer - une redirection 301 vers le navigateur sera effectuée et l'URL du navigateur sera mise à jour en conséquence.
Voici la réponse précédente, qui est inefficace à cause de regex, un simple 301 est génial, comme le montre @kmindi
J'utilise nginx 0.8.39 et les versions ultérieures, et j'utilise les éléments suivants:
Envoie une redirection permanente au client.
la source
Je pense que le meilleur et le seul moyen devrait être d'utiliser un HTTP 301 déplacé de façon permanente, comme suit:
La redirection HTTP 301 Moved Permanently est également la plus efficace, car il n’ya pas d’expression rationnelle à évaluer, selon les pièges déjà mentionnés .
Le nouveau protocole HTTP 308 déplacé conserve de manière permanente la méthode Request et est pris en charge par les principaux navigateurs . Par exemple, l'utilisation
308
empêche les navigateurs de changer la méthode de demande dePOST
enGET
pour la demande de redirection.Si vous souhaitez conserver le nom d’hôte et le sous - domaine, c’est la solution.
Cela fonctionne toujours si vous n’avez pas de DNS , car je l’utilise aussi localement. Je demande par exemple avec
http://192.168.0.100/index.php
et sera redirigé vers exactementhttps://192.168.0.100/index.php
.J'utilise
listen [::]:80
sur mon hôte parce que je l'aibindv6only
défini surfalse
, de sorte qu'il se lie également à la prise ipv4. changez-le enlisten 80
si vous ne voulez pas IPv6 ou si vous voulez vous connecter ailleurs.La solution de Saif Bechan utilise le
server_name
qui dans mon cas est localhost mais qui n'est pas accessible via un réseau.La solution de Michael Neale est bonne, mais selon les pièges, il existe une meilleure solution avec redirect 301;)
la source
Dans le bloc serveur, vous pouvez également effectuer les opérations suivantes:
la source
Ce qui précède n'a pas fonctionné avec de nouveaux sous-domaines étant créés tout le temps. Exemple: AAA.example.com BBB.example.com pour environ 30 sous-domaines.
Enfin, une configuration fonctionnant avec les éléments suivants:
la source
301 https://*/
ou annulerait la demande prématurément dans les autres réponses ici.server_name _;
avec$host
était la réponse qui a fait le tour. +1_
par le domaine réel, par exemple,.domain.com
j'avais deux serveurs, et nginx dirigeait accidentellement l'un de mes serveurs vers le serveur par défaut.J'ai posté un commentaire sur la bonne réponse il y a très longtemps avec une correction très importante, mais j'estime qu'il est nécessaire de mettre en évidence cette correction dans sa propre réponse. Aucune des réponses précédentes ne peut être utilisée en toute sécurité si, à un moment quelconque, vous avez configuré HTTP non sécurisé et attendez-vous du contenu utilisateur, des formulaires, l'hôte d'une API ou avez configuré un site Web, un outil, une application ou un utilitaire pour communiquer avec votre site.
Le problème se produit lorsqu'une
POST
demande est faite à votre serveur. Si la réponse du serveur avec une30x
redirection en clair, le contenu du POST sera perdu. Qu'est-ce qui se passe est que le navigateur / client mettra à niveau la demande à SSL mais rétrograder la demandePOST
à uneGET
demande. LesPOST
paramètres seront perdus et une demande incorrecte sera faite à votre serveur.La solution est simple Vous devez utiliser une
HTTP 1.1 307
redirection. Ceci est détaillé dans RFC 7231 S6.4.7:La solution, adaptée de la solution acceptée, consiste à utiliser
307
dans votre code de redirection:la source
J'ai réussi à le faire comme ça:
https://stackoverflow.com/a/36777526/6076984
la source
Je lance ngnix derrière un AWS ELB. L'ELB parle à ngnix via http. Etant donné que l'ELB n'a aucun moyen d'envoyer des redirections aux clients, je vérifie l'en-tête X-Forwarded-Proto et redirige:
la source
Si vous
return 301 https://$host$request_uri;
répondez par défaut sur le port 80, votre serveur pourrait tôt ou tard figurer sur une liste de proxies ouverts [1] et commencer à être abusé pour envoyer du trafic ailleurs sur Internet. Si vos journaux se remplissent de messages comme celui-ci, alors vous savez que cela vous est arrivé:Le problème est que cela
$host
fera écho à tout ce que le navigateur envoie dans l'en-Host
tête ou même le nom d'hôte à partir de la première ligne de HTTP, comme celle-ci:À cause de ce problème, certaines autres réponses recommandent d'utiliser
$server_name
plutôt que de$host
.$server_name
évalue toujours à ce que vous avez mis dans laserver_name
déclaration. Mais si vous avez plusieurs sous-domaines ou si vous utilisez un caractère générique, cela ne fonctionnera pas, car$server_name
n'utilise que la première entrée après laserver_name
déclaration et, plus important encore, fera simplement écho à un caractère générique (pas à le développer).Alors, comment prendre en charge plusieurs domaines tout en maintenant la sécurité? Sur mes propres systèmes, j'ai résolu ce dilemme en listant tout d' abord un
default_server
bloc non utilisé$host
, puis en listant un bloc générique qui:(Vous pouvez également répertorier plus d'un domaine dans le deuxième bloc.)
Avec cette combinaison, les domaines sans correspondance seront redirigés quelque part (toujours
example.com
) codés en dur , et les domaines correspondant aux vôtres iront au bon endroit. Votre serveur ne sera pas utile en tant que proxy ouvert, vous ne rencontrerez donc aucun problème.Si vous vous sentez vexé, je suppose que vous pourriez également faire en sorte que le
default_server
bloc ne corresponde à aucun de vos domaines légitimes et serve quelque chose d'offensant. . . .[1] Techniquement, "proxy" n'est pas le bon mot, car votre serveur ne répond pas et ne répond pas aux demandes des clients, mais envoie simplement une redirection, mais je ne suis pas sûr du mot exact. Je ne sais pas non plus quel est l'objectif, mais il remplit vos journaux de bruit et consomme votre processeur et votre bande passante. Vous pouvez donc tout aussi bien y mettre un terme.
la source
On dirait que personne ne l'a vraiment compris à 100%. Pour que les demandes du port 80 atteignent leurs équivalents 443 pour un serveur Web entier, vous devez utiliser la directive listen , et non la directive server_name, pour spécifier le nom fourre-tout . Voir aussi https://nginx.org/en/docs/http/request_processing.html
Et assurez-vous de vérifier ce qui est déjà dans /etc/nginx/conf.d/ car, le plus souvent, je rencontrais des problèmes dans lesquels le fichier default.conf renvoyait des vhost existants. Mon ordre de travail avec les problèmes nginx commence toujours par déplacer le fichier par défaut, en le remettant en commentaire ligne par ligne pour voir où il ne va pas.
la source
la source