upstream reverso proxy_pass example nginx proxy proxypass

reverso - NginX trazando una barra inclinada en la URL de pase de proxy



proxy reverso nginx (1)

Sé que esta pregunta se me ha hecho muchas veces, pero después de intentar muchas soluciones todavía estoy atascado.

Estoy usando NginX para pasar proxy a una aplicación NodeJs. Estoy intentando hacer que el proxy url https://example.com pase la solicitud a http://example.com:8080/?

Las solicitudes (desde una aplicación móvil) solicitan https://example.com// que nginx está haciendo http://example.com:8080//? que no está funcionando.

Cosas que he intentado que no han funcionado:

  • merge_slashes on; (que está activado por defecto)
  • rewrite ^/(.*)/$ /$1 permanent;
  • port_in_redirect off;

Mi configuración nginx:

location = /a { proxy_pass http://127.0.0.1:8080; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_read_timeout 300; } location ^~ /a/ { proxy_pass http://127.0.0.1:8080; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_read_timeout 300; }


Supongo que usas proxy_pass sin URI. En ese caso, nginx pasa el URI original tal como estaba, no está normalizado. Por lo tanto, debe usar proxy_pass http://backend/;

ACTUALIZAR

Así que estaba en lo correcto. Simplemente agregue la parte de URI a proxy_pass de la siguiente manera:

location = /a { proxy_pass http://127.0.0.1:8080/a; ... } location ^~ /a/ { proxy_pass http://127.0.0.1:8080/a/; ... }

Como se indica en la documentación de nginx si proxy_pass usó sin URI (es decir, sin la ruta después del servidor: puerto) nginx colocará el URI desde la solicitud original exactamente como estaba con todas las barras diagonales dobles, ../ y así sucesivamente.

Por otro lado, el URI en proxy_pass actúa como una directiva alias , significa que nginx reemplazará la parte que coincida con el prefijo de ubicación (en el caso de que sea /a en la primera ubicación y /a/ sea ​​el segundo) con URI en la directiva proxy_pass (que hice intencionadamente lo mismo que el prefijo de ubicación) para que el URI sea el mismo que se solicitó pero normalizado (sin barras de doblez y todo ese personal). Tenga cuidado con las barras inclinadas. Nginx reemplaza parte literalmente y podrías terminar con alguna url extraña.

Aquí hay un ejemplo con barra inclinada en la location , pero sin barra inclinada en proxy_pass .

location /one/ { proxy_pass http://127.0.0.1:8080/two; ... }

si va a la dirección http://yourserver.com/one/path/here?param=1 nginx solicitará proxy a http://127.0.0.1/twopath/here?param=1 . Vea cómo two y path concatena.