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é:
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 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:
GET http://www.ioffer.com/i/new-fashion-fine-gold-bracelet-versaec-bracelet-641175733 HTTP/1.1
À 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 la 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
n'utilise que la première entrée après la server_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:
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 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.