Cómo preservar la URL de solicitud con Nginx proxy_pass
Pregunta
Estaba tratando de usar Delgada servidor de aplicaciones y tuvo un problema.
Cuando nginx indicadores la solicitud de adelgazar (o unicornio) usando proxy_pass http://my_app_upstream;
La solicitud recibe la URL modificada enviada por Nginx (http://my_app_upstream
).
Lo que quiero es pasar la URL original y la solicitud original del cliente sin modificación, ya que la aplicación depende en gran medida de ella.
El nginx ' doc dice:
Si es necesario transmitir URI en la forma no procesada, entonces la directiva proxy_pass debe usarse sin parte de URI.
Pero no entiendo cómo configurar exactamente eso, ya que la muestra relacionada realmente está usando URI:
location /some/path/ {
proxy_pass http://127.0.0.1;
}
Entonces, ¿podrías ayudarme a averiguar cómo preserva la URL de solicitud original del cliente?
Solución
Pienso que el proxy_set_header
La directiva podría ayudar:
location / {
proxy_pass http://my_app_upstream;
proxy_set_header Host $host;
# ...
}
Otros consejos
Solo proxy_set_header host $ host Miss Port para mi caso. Resuelto por:
location / {
proxy_pass http://BACKENDIP/;
include /etc/nginx/proxy.conf;
}
y luego en el proxy.conf
proxy_redirect off;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
Para avanzar perfectamente sin cortar el absoluteURI
de la solicitud y el Host
En el encabezado:
server {
listen 35005;
location / {
rewrite ^(.*)$ "://$http_host$uri$is_args$args";
rewrite ^(.*)$ "http$uri$is_args$args" break;
proxy_set_header Host $host;
proxy_pass https://deploy.org.local:35005;
}
}
Encontrado aquí: https://opensysnotes.wordpress.com/2016/11/17/nginx-proxy_pass-with-absolute-url/
Nginx también proporciona la variable $ http_host que pasará el puerto por usted. Es una concatenación de host y puerto.
Así que solo necesitas hacer:
proxy_set_header Host $http_host;
En caso de que algo modifique la ubicación que está tratando de servir, por ejemplo, try_files
, esto conserva la solicitud del back-end:
location / {
proxy_pass http://127.0.0.1:8080$request_uri;
}
En mi escenario, he hecho esto a través del código a continuación en la configuración de Nginx Vhost
server {
server_name dashboards.etilize.com;
location / {
proxy_pass http://demo.etilize.com/dashboards/;
proxy_set_header Host $http_host;
}}
$ http_host establecerá URL en el encabezado igual que el solicitado
Nota para otras personas que encuentran esto: el corazón de la solución para hacer que Nginx no manipule la URL, es eliminar la barra de corte al final de la copia: Directiva proxy_pass. http: // my_app_upstream VS http: // my_app_upstream/ - Hugo Josefson
Encontré esto arriba en los comentarios, pero creo que realmente debería ser una respuesta.
Para mi servidor de autores ... esto funciona. Me gusta tener opciones para /auth para mi propia legibilidad humanizada ... o también lo tengo configurado por puerto /aguas arriba para máquina a máquina.
.
Al comienzo de conf
####################################################
upstream auth {
server 127.0.0.1:9011 weight=1 fail_timeout=300s;
keepalive 16;
}
Dentro de mi bloque de servidor 443
if (-d $request_filename) {
rewrite [^/]$ $scheme://$http_host$uri/ permanent;
}
location /auth {
proxy_pass http://$http_host:9011;
proxy_set_header Origin http://$host;
proxy_set_header Host $http_host:9011;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_http_version 1.1;
}
En la parte inferior de conf
#####################################################################
# #
# Proxies for all the Other servers on other ports upstream #
# #
#####################################################################
#######################
# Fusion #
#######################
server {
listen 9001 ssl;
############# Lock it down ################
# SSL certificate locations
ssl_certificate /etc/letsencrypt/live/allineed.app/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/allineed.app/privkey.pem;
# Exclusions
include snippets/exclusions.conf;
# Security
include snippets/security.conf;
include snippets/ssl.conf;
# Fastcgi cache rules
include snippets/fastcgi-cache.conf;
include snippets/limits.conf;
include snippets/nginx-cloudflare.conf;
########### Location upstream ##############
location ~ / {
proxy_pass http://auth;
proxy_set_header Origin http://$host;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_http_version 1.1;
}
if (-d $request_filename) {
rewrite [^/]$ $scheme://$http_host$uri/ permanent;
}
}