Se você return 301 https://$host$request_uri;
for a resposta padrão na porta 80, seu servidor poderá, mais cedo ou mais tarde, entrar em uma lista de proxies abertos [1] e começar a ser abusado para enviar tráfego para outro local na Internet. Se seus registros estiverem cheios de mensagens como esta, você sabe que isso aconteceu com você:
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)"
O problema é que $host
retornará o que o navegador envia no cabeçalho Host
ou até mesmo o nome do host da linha de abertura do HTTP, como esta:
GET http://www.ioffer.com/i/new-fashion-fine-gold-bracelet-versaec-bracelet-641175733 HTTP/1.1
Devido a esse problema, algumas outras respostas aqui recomendam usar $server_name
em vez de $host
. $server_name
sempre avalia o que você coloca na declaração server_name
. Mas se você tiver vários subdomínios ou usar um caractere curinga, isso não funcionará, pois $server_name
usará somente a entrada primeiro após a declaração server_name
e, mais importante, ecoará um caractere curinga (não expandi-lo).
Então, como apoiar vários domínios, mantendo a segurança? Em meus próprios sistemas, lidei com esse dilema primeiro listando um bloco default_server
que não usa $host
e, em seguida, listando um bloco curinga que:
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;
}
(Você também pode listar mais de um domínio no segundo bloco.)
Com essa combinação, domínios não correspondentes serão redirecionados para algum lugar codificado (sempre example.com
) e os domínios que correspondem aos seus próprios irão para o local correto. Seu servidor não será útil como um proxy aberto, por isso você não estará causando problemas.
Se você estiver se sentindo estranho, suponho que você também pode fazer com que o default_server
block corresponda a nenhum de seus domínios legítimos e ofereça algo ofensivo. . . .
[1] Tecnicamente, "proxy" é a palavra errada, porque o seu servidor não está saindo e atendendo a pedidos para os clientes, apenas enviando um redirecionamento, mas não tenho certeza qual seria a palavra certa. Eu também não tenho certeza qual é o objetivo, mas ele enche seus logs com ruído e consome seu CPU e largura de banda, então você pode acabar com isso.