nginx proxy_pass reescrita da localização do cabeçalho de resposta

7

O objetivo dessa instância do nginx é fazer com que o GitLab e o OpenWRT Luci sejam redirecionados por meio de um proxy reverso. Ele já está trabalhando para vários outros sites, todos com uma URL de base que parece conter esse problema.

  • O GitLab neste exemplo está no servidor local na porta 9000.
  • O site nginx está na porta 8080.
  • O OpenWRT tem exatamente o mesmo problema, mas com / cgi-bin / luci /

A configuração nginx relevante para o local do exemplo é

location /gitlab/ {
    proxy_pass http://127.0.0.1:9000/;
    proxy_redirect default;
}
  • Observe que os resultados são os mesmos com e sem uma barra final.

Existem algumas opções de configuração de proxy de cabeçalho sendo aplicadas a esse local.

# Timeout if the real server is dead
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;

# Basic Proxy Config
proxy_set_header    Host $host:$server_port;
proxy_set_header    Origin $scheme://$host:$server_port;    
proxy_set_header    Connection $http_connection;
proxy_set_header    Cookie $http_cookie;
proxy_set_header    Upgrade $http_upgrade;
proxy_set_header    X-Forwarded-Protocol $scheme;
proxy_set_header    X-Scheme $scheme;
proxy_set_header    X-Real-IP $remote_addr;
proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header    X-Forwarded-Ssl on;
proxy_set_header    X-Frame-Options SAMEORIGIN;

# Advanced Proxy Config
send_timeout            5m;
proxy_read_timeout      300;
proxy_send_timeout      300;
proxy_connect_timeout   300;

proxy_buffers 32 4k;
proxy_buffer_size           4k;
proxy_busy_buffers_size     64k;
proxy_temp_file_write_size  64k;

proxy_http_version 1.1;
proxy_cache_bypass $cookie_session;
proxy_no_cache $cookie_session;]
  • Comente o #proxy_set_header O host redireciona o navegador para https://127.0.0.1:9000/users/sign_in

Ao navegar para https://website.com:8080/gitlab/ ;

GET /gitlab/ HTTP/1.1
Host: website.com:8080

A resposta retorna incorretamente para /users/sign_in em vez de /gitlab/users/sign_in

HTTP/1.1 302 Found
Cache-Control: no-cache
Connection: keep-alive
Content-Type: text/html; charset=utf-8
Location: https://website.com:8080/users/sign_in

Navegar manualmente para o link carrega a página, mas não os recursos, até a mesma questão acima.

GitLab Asset Fail

Ao ler docs nginx , sugere-se que o comportamento de proxy padrão manipule esse cenário, embora parece falhar.

Os registros não parecem mostrar muito.

Que medidas adicionais devem ser tomadas para ajudar a diagnosticar por que isso pode estar acontecendo?

    
por Jake Edwards 27.03.2015 / 15:41

2 respostas

3

Adicione uma barra ao seu proxy_pass target.

Atualização: O OP não precisou que o vhost estava aceitando https . Como o esquema é encaminhado para o servidor backend com cabeçalhos adicionais, ocorre um problema, pois proxy_redirect default; ordena que nginx espere link ao reescrever Location cabeçalhos nas respostas upstream, em vez de https.

Então, isso teve que ser alterado explicitamente para um formulário mais genérico (a barra final ainda é necessária):

location /gitlab/ {
    proxy_pass http://127.0.0.1:9000/;
    proxy_redirect $scheme://$host:$server_port/ /gitlab/;
}
    
por 27.03.2015 / 22:43
0

O que @XavierLucas diz é correto o backup deve lidar com os links. A documentação do gitlab tem um guia sob o título Instale o GitLab em um URL relativo . Eu encontrei este problema recentemente enquanto estabelecia um servidor arch linux com gitlab e nginx instalado e isso resolveu meu problema recompilando todos os ativos para ter o caminho relativo correto.

    
por 01.01.2018 / 22:44