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 outros lugares na Internet. Se seus logs forem preenchidos com mensagens como esta, você saberá 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
ele retornará o que o navegador enviar no Host
cabeçalho ou até 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 o uso em $server_name
vez de $host
. $server_name
sempre avalia o que você coloca na server_name
declaração. Mas se você tiver vários subdomínios lá ou usar um curinga, isso não funcionará, porque $server_name
só usa a primeira entrada após a server_name
declaração e, o mais importante, apenas fará eco de um curinga (não o expanda).
Então, como oferecer suporte a vários domínios enquanto mantém a segurança? Em meus próprios sistemas, lidei com esse dilema listando primeiro um default_server
bloco 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, os domínios não correspondentes serão redirecionados para algum lugar codificado (sempre example.com
) e os domínios que correspondem ao seu irão para o lugar certo. Seu servidor não será útil como um proxy aberto, portanto você não estará atraindo problemas.
Se você estiver com raiva, suponho que você também possa fazer com que o default_server
bloco não corresponda a nenhum dos seus domínios legítimos e sirva algo ofensivo. . . .
[1] Tecnicamente "proxy" é a palavra errada, porque seu servidor não está saindo e atendendo solicitações para os clientes, apenas enviando um redirecionamento, mas não tenho certeza qual seria a palavra certa. Também não tenho certeza de qual é o objetivo, mas ele enche seus logs de ruído e consome sua CPU e largura de banda; portanto, é melhor parar com isso.