Si vous return 301 https://$host$request_uri;
comme réponse par défaut sur le port 80, votre serveur peut tôt ou tard se retrouver sur une liste de proxies ouverts[1] et commencer à être utilisé de manière abusive pour envoyer du trafic ailleurs sur Internet. Si vos journaux sont remplis de messages comme celui-ci, vous savez que cela vous est arrivé :
42.232.104.114 - - [25/Mar/2018:04:50:49 +0000] "GET http://www.ioffer.com/i/new-fashion-fine-gold-bracelet-versaec-bracelet-641175733 HTTP/1.1" 301 185 "http://www.ioffer.com/" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; Hotbar 4.1.8.0; RogueCleaner; Alexa Toolbar)"
Le problème est que $host
renverra ce que le navigateur envoie dans le champ Host
ou même le nom d'hôte de la ligne d'ouverture de HTTP, comme celle-ci :
GET http://www.ioffer.com/i/new-fashion-fine-gold-bracelet-versaec-bracelet-641175733 HTTP/1.1
En raison de ce problème, d'autres réponses ici recommandent d'utiliser $server_name
au lieu de $host
. $server_name
évalue toujours à ce que vous mettre dans le server_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
utilise uniquement le primero après l'entrée server_name
et, plus important encore, ne fera que renvoyer un caractère générique (sans 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 de la manière suivante primero liste des default_server
qui n'utilise pas $host
puis de lister un bloc joker qui le fait :
server {
listen 80 default_server;
server_name example.com;
return 301 https://example.com$request_uri;
}
server {
listen 80;
server_name *.example.com;
return 301 https://$host$request_uri;
}
(Vous pourriez également énumérer plus d'un domaine dans le deuxième bloc).
Avec cette combinaison, les domaines qui ne correspondent pas seront redirigés vers un endroit codé en dur (toujours example.com
), et les domaines qui correspondent aux vôtres iront au bon endroit. Votre serveur ne sera pas utile en tant que proxy ouvert, vous ne vous attirerez donc pas d'ennuis.
Si vous êtes de mauvaise humeur, je suppose que vous pourriez également faire le default_server
correspondance des blocs aucun de vos domaines légitimes et servir quelque chose d'offensant. . . . .
[1] Techniquement, "proxy" n'est pas le bon mot, car votre serveur ne va pas répondre aux requêtes des clients, il envoie juste une redirection, mais je ne suis pas sûr du mot juste. Je ne suis pas non plus sûr du but recherché, mais cela remplit vos journaux de bruit et consomme votre CPU et votre bande passante, alors autant y mettre un terme.
2 votes
Veuillez envisager de déplacer la "réponse acceptée" vers serverfault.com/a/171238/90758 . C'est le bon.
0 votes
Il suffit d'utiliser $server_name au lieu du code dur mysite.com.