NGINX: redirigir solicitud a otra IP, manteniendo la URL

NGINX: redirigir solicitud a otra IP, manteniendo la URL

Tengo configurado DNS dinámico y quiero poder acceder a diferentes computadoras desde fuera de mi casa. Actualmente tengo una Raspberry Pi que ejecuta nginx en 192.168.1.2, con mi enrutador en 192.168.1.1. También tengo el puerto 80 reenviado desde el enrutador a la raspberry pi, por lo que simplemente presionar la URL DNS dinámica me muestra la página phpinfo() en mi página de inicio de pi.

A continuación, quiero poder mydns.com/device1mantener esa URL mientras redirijo bajo el capó al otro dispositivo.

En otras palabras, veré http://mydns.com/device1, pero accederé http://192.168.1.3internamente. Además, si escribo, mydns.com/device1/loginse redirigirá internamente a http://192.168.1.3/login.

Estoy tratando de usar sub_filterasí:

sub_filter_once off;
sub_filter_types text/html;
sub_filter ""http://192.168.1.3" "http://192.168.1.2"
proxy_pass http://192.168.1.3/;
proxy_set_header Host $host;

Esto está funcionando hasta cierto punto, pero no del todo. Las rutas no redirigen, por ejemplo, archivos en subcarpetas. Por ejemplo:

Quiero esto: http://mydns.com/device1/style/basic.css

Pero entiende esto: http://mydns.com/style/basic.css

Esto provoca un error 404, como se puede ver en la vista Consola en Chrome. Recibo este error:

Failed to load resource: the server responded with a status of 404 (Not Found)

Esto está en el camino: http://mydns.com/style/basic.csspero necesito http://mydns.com/device1/style/basic.css.

Puedo acceder al archivo CSS en la barra de direcciones escribiendo http://mydns.com/device1/style/basic.css. así que sé que es accesible, simplemente no puedo hacer que NGINX reenvíe/reescriba estas carpetas.

¿Alguien puede ayudar? Gracias

Respuesta1

Podría tener varias razones:

  • o algo reescribe su URI antes de ingresar a la ubicación con proxy_pass;
  • o se suministra como sub-URI coincidente en algunas ubicaciones procesadas anteriormente;
  • o (en su versión de nginx) la barra diagonal /después de IP en la directiva proxy_pass hace que nginx tome la barra diagonal como un URI de proxy y la reescriba antes de enviarla.

No se puede ver qué sucede exactamente de tu lado sin ver toda tu configuración. O puede intentar habilitar el registro de depuración (para ver qué causa esto).

De todos modos, en relación con los motivos mencionados anteriormente, tienes 3 formas de resolverlo:

  • o evitará la reescritura o tendrá que agregar algo adicional rewrite ... breakantes de proxy_pass para extender el URI;
  • o puede intentar definirlo como proxy_pass http://192.168.1.3/device1/;o con alguna variable (de mapeo) similar proxy_pass http://192.168.1.3/$device/;o incluso con un URI originado completo como proxy_pass http://192.168.1.3$request_uri;(tenga en cuenta que no hay ningún /aquí).
  • o puede intentar eliminar la barra diagonal, de modo que proxy_pass http://192.168.1.3;(sin barra diagonal) en lugar de proxy_pass http://192.168.1.3**/**;(con barra diagonal).
    En este caso, "el URI de solicitud se pasa al servidor en la misma forma en que lo envía un cliente cuando se procesa la solicitud original" (si no se realizan reescrituras), o "el URI de solicitud normalizado completo se pasa al procesar el URI modificado" (si se produjeron algunas reescrituras o si tiene algunas ubicaciones provisionales con alias y try_files ... @proxyaprobadas).

Echa un vistazo acontraseña_proxydocumentación para todas las variantes posibles del uso de proxy_pass.

información relacionada