nginx proxy_pass reescribir la ubicación del encabezado de respuesta

11

El objetivo de esta instancia de nginx es hacer que GitLab y OpenWRT Luci redirijan a través de un proxy inverso. Ya está funcionando para varios otros sitios web, todos los cuales tienen una URL base que parece contrarrestar este problema.

  • GitLab en este ejemplo está en el servidor local en el puerto 9000.
  • El sitio web nginx está en el puerto 8080.
  • OpenWRT tiene exactamente el mismo problema, pero con / cgi-bin / luci /

La configuración de nginx relevante para la ubicación de ejemplo es;

location /gitlab/ {
    proxy_pass http://127.0.0.1:9000/;
    proxy_redirect default;
}
  • Tenga en cuenta que los resultados son los mismos con y sin una barra inclinada final.

Hay algunas opciones de configuración de proxy de encabezado que se aplican a esta ubicación.

# 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;]
  • Comentando #proxy_set_header Host en su lugar redirige el navegador a https://127.0.0.1:9000/users/sign_in

Al navegar hacia https://website.com:8080/gitlab/;

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

La respuesta vuelve incorrectamente a en /users/sign_inlugar 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 a https: // sitio web: 8080 / gitlab / users / sign_in carga la página, pero no hay activos, ya que caen hasta el mismo problema que el anterior.

Error de activos de GitLab

Al leer documentos nginx , sugiere que el comportamiento de proxy predeterminado debería manejar este escenario, aunque parece fallar.

Los registros no parecen mostrar mucho.

¿Qué pasos adicionales deben tomarse para ayudar a diagnosticar por qué esto podría estar sucediendo?

Jake Edwards
fuente

Respuestas:

3

Agregue una barra diagonal a su proxy_passobjetivo.

Actualización: El OP no precisó que el vhost estaba aceptando https. A medida que el esquema se reenvía al servidor de fondo con encabezados adicionales, se produce un problema ya que proxy_redirect default;ordena a nginx que espere el esquema http de forma predeterminada al reescribir Locationencabezados en respuestas anteriores, en lugar de https.

Entonces, esto tuvo que cambiarse explícitamente a una forma más genérica (la barra diagonal sigue siendo necesaria):

location /gitlab/ {
    proxy_pass http://127.0.0.1:9000/;
    proxy_redirect $scheme://$host:$server_port/ /gitlab/;
}
Xavier Lucas
fuente
Hola Xavier, gracias por la respuesta. No hubo suerte allí. Esa es una de las cosas que he probado (que coinciden con los documentos proxy_pass) pero sin cambios :(
Jake Edwards
He agregado información sobre el proxy_set_header que estaba en otra conf. La eliminación de la línea de host cambia las cosas: redirige a 127.0.0.1:9000/users/sign_in
Jake Edwards el
Ok, entonces el problema es el scheme(https) con el proxy_redirect default comportamiento que espera http. Deje la configuración como estaba antes de comentar el encabezado del Host y cambie el proxy_redirectcontenido a $scheme://$host:$server_port/ /gitlab/;. Asegúrese de no estar presionando los encabezados almacenados en caché del navegador (use herramientas cli o navegación privada) cuando realice la prueba.
Xavier Lucas
De acuerdo, genial, por lo que ahora se dirige a la URL correcta (al menos GitLab lo hace, OpenWRT aún va a / cgi-bin / luci, uno a la vez). No tiene ningún activo / images / etc Sin embargo -: 8080 / activos / aplicaciones-5ec1aeb4604cbfbeff836f956308b0ed.js en lugar de: 8080 / gitlab / activos / aplicación 5ec1aeb4604cbfbeff836f956308b0ed.js
Jake Edwards
1
Los enlaces de @ShadowXVII Assets son generados por su aplicación, debe cambiarlo allí. Nginx solo reescribirá los redireccionamientos emitidos por su aplicación, no los contenidos de la página.
Xavier Lucas
0

Lo que @XavierLucas dice es correcto, el respaldado debe manejar los enlaces. La documentación de gitlab tiene una guía bajo el encabezado Instalar GitLab bajo una URL relativa . Me encontré con este problema recientemente mientras configuraba un servidor Arch Linux con gitlab y nginx instalados y esto resolvió mi problema al recompilar todos los activos para tener la ruta relativa correcta.

Pistola
fuente