En Nginx hemos estado intentando redirigir una URL de la siguiente manera:
http://example.com/some/path -> http://192.168.1.24
donde el usuario todavía ve la URL original en su navegador. Una vez que se redirige al usuario, digamos que hace clic en el enlace /section/index.html
, nos gustaría que esto haga una solicitud que conduzca a la redirección
http://example.com/some/path/section/index.html -> http://192.168.1.24/section/index.html
y nuevamente conserva la URL original.
Nuestros intentos han involucrado varias soluciones usando proxies y reglas de reescritura, y a continuación se muestra la configuración que nos ha acercado más a una solución (tenga en cuenta que esta es la configuración del servidor web para el example.com
servidor web). Sin embargo, todavía hay dos problemas con esto:
- No realiza la reescritura correctamente, ya que la URL de solicitud recibida por el servidor web
http://192.168.1.24
incluye/some/path
y, por lo tanto, no sirve la página requerida. Cuando pasa el cursor sobre un enlace una vez que se ha publicado una página,
/some/path
falta en la URLserver { listen 80; server_name www.example.com; location /some/path/ { proxy_pass http://192.168.1.24; proxy_redirect http://www.example.com/some/path http://192.168.1.24; proxy_set_header Host $host; } location / { index index.html; root /var/www/example.com/htdocs; } }
Estamos buscando una solución que solo implique cambiar la configuración del servidor web example.com
. Podemos cambiar la configuración en 192.168.1.24
(también Nginx), sin embargo, queremos intentar evitar esto porque tendremos que repetir esta configuración para cientos de servidores diferentes cuyo acceso se realiza mediante proxy example.com
.
root
dentro de unlocation
bloque, entonces no obtendrá ningún comportamiento inesperado para las ubicaciones predeterminadas. Solo si necesita cambiar el valor predeterminadoroot
para cada ubicación, puede usarlo.Debe usar la parte URI en la
proxy_pass
directiva. Además, mezcló argumentos de orden deproxy_redirect
directivas, y probablemente no lo necesite en absoluto. Nginx tiene un valor predeterminado razonable para esta directiva.En este caso, su
location
bloqueo podría ser realmente simple:fuente
/some/path/
parte de la URL se conserva en la solicitud que no es una URL válida (también necesitamos reescribir la URL para eliminarla).Puede usar la siguiente configuración para tener una asignación 100% perfecta entre
/some/path/
el front-end y/
el back-end.Tenga en cuenta que esta es la única respuesta hasta ahora que también se encargaría sin problemas de las rutas absolutas que generan
404 Not Found
errores, siempre queReferer
el navegador envíe el encabezado HTTP correcto , por lo que todos esos gifs deben continuar cargándose sin necesidad de modificar el HTML subyacente (que no solo es costoso, sino que tampoco es compatible sin módulos adicionales no compilados de forma predeterminada).Puede encontrar la prueba de concepto completa y el producto mínimamente viable en el repositorio https://github.com/cnst/StackOverflow.cnst.nginx.conf .
Aquí hay una prueba para confirmar que todos los casos límite parecen funcionar:
PD: si tiene muchas rutas diferentes para mapear, en lugar de hacer una comparación de expresiones regulares
$http_referer
dentro de unif
interiorlocation @404
, es posible que desee utilizar lamap
directiva basada en global en su lugar.También tenga en cuenta que las barras diagonales finales tanto en el
proxy_pass
como en ellocation
que está contenido son bastante importantes según una respuesta relacionada .Referencias
fuente
Cuando esa barra se agrega a un jenkins proxy nginx, aparece el error "Parece que su configuración de proxy inverso está rota".
Debería leer
fuente