Impedir alteração de porta no redirecionamento no nginx

6

Atualmente, tenho a configuração nginx para exibir conteúdo por meio do verniz. O Nginx escuta na porta 8000 e o verniz conecta as solicitações dos usuários de 80 a 8000.

O problema é que, em algumas ocasiões, particularmente ao tentar acessar um diretório, como site.com/2010 , o nginx está redirecionando a solicitação para site.com:8000/2010/ .

Como posso evitar isso?

    
por arbales 27.01.2011 / 19:21

4 respostas

9

Encontrei a resposta para essa pergunta lendo com mais cuidado os documentos do HttpCoreModule .

port_in_redirect off;

Isso retém a porta usada pelo cliente durante os redirecionamentos. Intimamente relacionado é server_name_in_redirect que usa o primeiro nome de host para redirecionamentos. Como eu não queria que sitename.v.myserver.com redirecionasse para sitename.com,

    
por 01.02.2011 / 02:21
5

No meu caso, o nginx escuta a porta 80 dentro de um contêiner docker, mas está mapeado para a porta 8080 (ou qualquer porta aleatória) fora do contêiner. Não há nenhum proxy reverso intermediário que possa adicionar cabeçalhos adequados para a porta e também não queira codificá-lo na configuração do nginx.

Exemplo de redirecionamento errado:

http://localhost:8080/directory -> http://localhost/directory/

Eu tentei:

server {
  # ...
  port_in_redirect off;
  server_name_in_redirect off;
  # ...
}

Mas não funcionou. A única coisa que funcionou bem foi:

server {
  # ...
  absolute_redirect off;
  # ...
}

Entrada manual para absolute_redirect diz:

If disabled, redirects issued by nginx will be relative.

Acho isso mais flexível e não exige que você tenha o nome do servidor e a porta codificados em qualquer lugar.

Se você estiver preocupado com redirecionamentos com URLs relativos, verifique este comentário .

    
por 22.02.2017 / 11:17
3

O código por trás do NGINX provavelmente usa a variável SERVER_PORT do FASTCGI para determinar para onde direcionar o usuário. SERVER_PORT conterá a porta nginx escuta, então seria 8000 no seu caso.

Você pode tentar algo assim para fins de teste:

location ~ \.php$ {
        [...]
        fastcgi_param  SERVER_PORT 80;
}

adaptado à sua configuração. Isso é um hack sujo, mas pode ajudá-lo a diagnosticar o problema.

    
por 28.01.2011 / 02:22
2

Para quem tem

  • Varnish escuta a porta 80
  • servidor de backend (no meu caso nginx) escuta a porta 8080

O fastcgi_param SERVER_PORT deve ser o mesmo da interface.

Então, eu defino

fastcgi_param  SERVER_PORT 80;

para redirecionar para o URL apropriado do nginx.

    
por 23.02.2015 / 14:12