![NGINX: localhost redirecionando para _](https://rvso.com/image/782624/NGINX%3A%20localhost%20redirecionando%20para%20_.png)
versão nginx/1.18.0 (Ubuntu) — Ubuntu 22.04.01 LTS x86_64 kernel 6.0.8
Eu tenho um servidor (especificações de instalação acima) que possui vários nomes de host, está executando o nginx e tudo está funcionando (incluindo o nginx, com redirecionamentos de http: para https:).
Na verdade, é assim que estou fazendo isso no meu servidor padrão:
listen 80 default_server;
listen 443 default_server ssl;
# force https-redirects
if ($scheme = http) {
return 301 https://$host$request_uri;
}
server_name _;
Aqui está o comportamento estranho:
URL | Redireciona para | Notas |
---|---|---|
http://mumblefrotz/ |
https://mumblefrotz/ |
(funciona como esperado) |
http://mumblefrotz.fullyqualified.com/ |
https://mumblefrotz.fullyqualified.com/ |
(funciona como esperado) |
http://127.0.0.1/ |
https://127.0.0.1/ |
(funciona como esperado) |
http://localhost/ |
https://_ |
FALHA |
Por que está fazendo isso? Suspeito que tenha algo a ver com oserver_name
diretiva sendo interpretada literalmente, embora não saiba ao certo por que isso só acontece para localhost
.
Ao olharesta sugestão do Stack Overflow, tentei os dois procedimentos a seguir e ainda obtive o sublinhado surpreendente:
server_name ~.;
server_name ~^(.+)$;
Minha expectativa é que $host
sejao nome do host passado na solicitação HTTP, com um host virtual selecionando-o, se algum tiver sido definido, e voltando para a definição de servidor padrão, caso contrário.
Pelo que posso dizer http://localhost/
é o único que não resolve corretamente. Eu gostaria de consertar isso.
Responder1
Não houve informação sobre a questão de qual cliente foi utilizado para fazer a solicitação. Como está escrito emdocumentação nginx, $host
a variável contém:
nesta ordem de precedência: nome do host da linha de solicitação, ou nome do host do campo de cabeçalho da solicitação “Host”, ou o nome do servidor que corresponde a uma solicitação
Aqui, "linha de solicitação" significa o nome do host após GET
o verbo na solicitação HTTP.
O segundo significa o Host
campo de cabeçalho.
O terceiro significa o nome configurado em server_name
.
No seu caso, acho que o cliente de teste fez uma solicitação que não continha Host
cabeçalho. Portanto, o nginx usou a server_name
configuração para o conteúdo da $host
variável.
Pessoalmente, acabei de gerar o bloco de encaminhamento HTTP -> HTTPS para cada servidor virtual, já que gerencio configurações nginx com Ansible. Dessa forma, posso ter um return 404
vhost para todos os outros nomes de host nos quais não estou interessado.
Mas se você precisar implementar um vhost comum para os redirecionamentos, poderá usar a seguinte abordagem:
map $http_host $redirect_host {
~ (^.+$) $http_host;
default example.com;
}
server {
listen 80 default_server;
...
if ($scheme = http) {
return 301 https://$redirect_host$request_uri;
}
}
Isso sempre usa o cabeçalho do host HTTP para o destino de redirecionamento, exceto quando não há Host
cabeçalho. Nesse caso, ele usa example.com
para o alvo de redirecionamento. Você pode atribuir seu nome de domínio principal como alvo de redirecionamento, por exemplo.