nginx proxy_pass riscrive la posizione dell'intestazione della risposta


11

Lo scopo di questa istanza di nginx è far reindirizzare GitLab e OpenWRT Luci attraverso un proxy inverso. Funziona già per molti altri siti Web, tutti con un URL di base che sembra contrastare questo problema.

  • GitLab in questo esempio si trova sul server locale alla porta 9000.
  • Il sito Web nginx è sulla porta 8080.
  • OpenWRT ha lo stesso identico problema, ma con / cgi-bin / luci /

La configurazione nginx rilevante per la posizione di esempio è;

location /gitlab/ {
    proxy_pass http://127.0.0.1:9000/;
    proxy_redirect default;
}
  • Si noti che i risultati sono gli stessi con e senza una barra finale.

Esistono alcune opzioni di configurazione del proxy dell'intestazione applicate a questa posizione.

# 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;]
  • Commentando #proxy_set_header, l'host reindirizza il browser a https://127.0.0.1:9000/users/sign_in

Durante la navigazione verso https://website.com:8080/gitlab/;

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

La risposta torna erroneamente al /users/sign_inposto di/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

Navigando manualmente su https: // website: 8080 / gitlab / users / sign_in carica la pagina, ma nessuna risorsa in quanto cadono fino allo stesso problema di cui sopra.

Asset GitLab non riuscito

Leggendo i documenti nginx , suggerisce che il comportamento proxy predefinito dovrebbe gestire questo scenario, anche se sembra fallire.

I registri non sembrano mostrare molto.

Quali ulteriori passi dovrebbero essere presi per aiutare a diagnosticare perché ciò potrebbe accadere?

Risposte:


3

Aggiungi una barra finale al proxy_passbersaglio.

Aggiornamento: l'OP non ha precisato che il vhost stava accettando https. Man mano che lo schema viene inoltrato al server back-end con intestazioni aggiuntive, si verifica un problema poiché proxy_redirect default;Nginx prevede che lo schema http venga predefinito per impostazione predefinita quando si riscrivono le Locationintestazioni nelle risposte a monte, anziché https.

Quindi, questo ha dovuto essere cambiato esplicitamente in una forma più generica (la barra finale è ancora necessaria):

location /gitlab/ {
    proxy_pass http://127.0.0.1:9000/;
    proxy_redirect $scheme://$host:$server_port/ /gitlab/;
}

Ciao Xavier, grazie per la risposta. Nessuna fortuna lì. Questa è una delle cose che ho provato (abbinando i documenti proxy_pass) ma nessuna modifica :(
Jake Edwards

Ho aggiunto informazioni su proxy_set_header che si trovava in un'altra conf. La rimozione della linea host cambia le cose - reindirizza a 127.0.0.1:9000/users/sign_in
Jake Edwards

Ok, quindi il problema è il scheme(https) con proxy_redirect default comportamento che prevede http. Lasciare la configurazione com'era prima di commentare l'intestazione Host e modificare il proxy_redirectcontenuto in $scheme://$host:$server_port/ /gitlab/;. Assicurati di non colpire le intestazioni memorizzate nella cache del browser (usa strumenti cli o navigazione privata) durante il test.
Xavier Lucas,

Ok, bello, quindi ora passa all'URL giusto (almeno GitLab, OpenWRT va ancora su / cgi-bin / luci - uno alla volta). Non ci sono risorse / immagini / ecc. Comunque: 8080 / risorse / applicazione-5ec1aeb4604cbfbeff836f956308b0ed.js invece di: 8080 / gitlab / risorse / applicazione-5ec1aeb4604cbfbeff836f956308b0ed.js
Jake Edwards

1
I collegamenti alle risorse @ShadowXVII sono generati dall'applicazione, è necessario modificarli lì. Nginx riscriverà solo i reindirizzamenti emessi dalla tua app, non i contenuti della pagina.
Xavier Lucas,

0

Ciò che @XavierLucas dice sia corretto, il supporto dovrebbe gestire i collegamenti. La documentazione di gitlab ha una guida sotto la voce Installa GitLab sotto un URL relativo . Di recente mi sono imbattuto in questo problema durante la configurazione di un server Arch Linux con gitlab e nginx installati e questo ha risolto il mio problema ricompilando tutte le risorse per avere il percorso relativo corretto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.