Temos uma configuração de servidor com a AWS que deve atender aos seguintes requisitos:
1: solicitações de entrada originadas do balanceador de carga (especificamente, verificações de integridade e verificações de latência) devem ter permissão para acessar os servidores da Web.
2: as solicitações válidas que contêm as sequências de Host
corretas devem ter permissão para acessar o servidor da web.
3: Todas as outras solicitações devem ser rejeitadas com a rejeição não padrão Nginx '444', o que significa que elas serão ignoradas.
Além disso, nosso site tem vários subdomínios, cada um executando essencialmente o mesmo código para diferentes clientes. Nós configuramos o Nginx para redirecionar todo o tráfego HTTP para esses subdomínios para https. Vou chamar esses subdomínios "a.example.com", "b.example.com" e "c.example.com".
Nós notamos em nossos registros que nosso código do Django está retornando muitos erros 500 devido a strings 'Host' falsas passando pelo Nginx. As strings de host que estamos vendo para cada uma dessas requisições é "* .example.com", que combina com qualquer um dos nossos subdomínios e, portanto, faz com que seja para o código do Django. Uma vez que essa string do host não é reconhecida, o Django retorna um erro 500.
O que se segue é um resumo aproximado do nosso arquivo disponível no Nginx:
# Repeat this for each subdomain:
server {
server_name a.example.com;
listen 80;
return 301 https://a.example.com$request_uri;
}
server {
server_name a.example.com;
listen 443;
location / {
set $my_host $host;
if ($host ~ "\d+\.\d+\.\d+\.\d+") {
set $my_host "elb.example.com";
}
}
}
Nós tentamos capturar esta string host incorreta com a seguinte definição de servidor "buraco negro" no Nginx:
server {
server_name *.example.com;
listen 80 default_server;
listen 443 default_server;
return 444
}
No entanto, a cadeia do host "* .example.com" corresponde a uma das definições do servidor https e é encaminhada para o código do Django.
O que estou perdendo?