Se return 301 https://$host$request_uri;
come risposta predefinita sulla porta 80, il tuo server potrebbe prima o poi ottenere un elenco di proxy aperti [1] e iniziare ad essere abusato di inviare traffico altrove su Internet. Se i tuoi registri si riempiono di messaggi come questo, allora sai che ti è successo:
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)"
Il problema è che $host
tornerà indietro qualunque cosa il browser invii Host
nell'intestazione o anche il nome host dalla riga iniziale di HTTP, come questo:
GET http://www.ioffer.com/i/new-fashion-fine-gold-bracelet-versaec-bracelet-641175733 HTTP/1.1
A causa di questo problema, alcune altre risposte qui raccomandano di usare $server_name
invece di $host
. $server_name
valuta sempre ciò che hai inserito nella server_name
dichiarazione. Ma se hai più sottodomini lì o usi un carattere jolly, questo non funzionerà, perché $server_name
usa solo la prima voce dopo la server_name
dichiarazione e, cosa più importante, tornerà indietro un carattere jolly (non espanderlo).
Quindi, come supportare più domini mantenendo la sicurezza? Sui miei sistemi ho affrontato questo dilemma elencando prima un default_server
blocco che non utilizza $host
, quindi elencando un blocco jolly che fa:
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;
}
(Potresti anche elencare più di un dominio nel secondo blocco.)
Con questa combinazione, i domini senza pari verranno reindirizzati da qualche parte (sempre example.com
) hardcoded e i domini che corrispondono ai tuoi andranno nel posto giusto. Il tuo server non sarà utile come proxy aperto, quindi non attirerai problemi.
Se ti senti strano, suppongo che potresti anche fare in modo che il default_server
blocco non corrisponda a nessuno dei tuoi domini legittimi e offra qualcosa di offensivo. . . .
[1] Tecnicamente "proxy" è la parola sbagliata, perché il tuo server non esce e non soddisfa le richieste per i client, sta solo inviando un reindirizzamento, ma non sono sicuro di quale sia la parola giusta. Inoltre, non sono sicuro di quale sia l'obiettivo, ma riempie i log di rumore e consuma la CPU e la larghezza di banda, quindi potresti anche fermarlo.