NGINX: localhost redirecionando para _

NGINX: localhost redirecionando para _

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_namediretiva 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 $hostsejao 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, $hosta 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 GETo verbo na solicitação HTTP.

O segundo significa o Hostcampo 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 Hostcabeçalho. Portanto, o nginx usou a server_nameconfiguração para o conteúdo da $hostvariá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 404vhost 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á Hostcabeçalho. Nesse caso, ele usa example.compara o alvo de redirecionamento. Você pode atribuir seu nome de domínio principal como alvo de redirecionamento, por exemplo.

informação relacionada