Proxy inverso de Nginx y reescritura de URL

Proxy inverso de Nginx y reescritura de URL

Me gustaría reescribir la URL en un proxy inverso para que elimine el primer segmento pero deje intactos los segmentos siguientes. Necesito que esto suceda antes de que llegue al pase de proxy.

Ejemplo:

/admin/auth/local ----> (REWRITES TO) /auth/local
/admin/auth/register -------> (REWRITES TO) /auth/register

Mi bloque de ubicación:

  location /admin {
        #add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
        add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
        proxy_set_header Host $host;
        proxy_set_header X-Real-Ip $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_pass_header Set-Cookie;
        proxy_read_timeout                 30;
        proxy_buffers 64 8k;
        rewrite /admin / break;
        proxy_pass http://127.0.0.1:9000;

Intenté lo siguiente sin suerte:

rewrite /admin / break;

Respuesta1

Hay dos partes aquí. El primero es cómo nginx enruta las solicitudes entrantes a través de proxy_pass.

Allí se pueden asignar solicitudes entrantes al /backend con /admin/prefijo con la siguiente configuración:

location / {
    proxy_pass http://127.0.0.1:9000/admin/;
}

No rewritese necesita ninguna declaración.

La segunda parte son las URL que genera la aplicación que se ejecuta en 127.0.0.1:9000. Debe configurar esa aplicación para generar URL sin el /adminprefijo para tener URL que coincidan con la configuración de enrutamiento de nginx.

Nginx no puede realizar este cambio de manera confiable en el contenido generado por el backend.

Respuesta2

Creo que solo necesitas agregar tu primer segmento (administrador) al pase de proxy.

proxy_pass http://www.example.com/admin/;

Respuesta3

Puedes probar el siguiente fragmento. Funciona para mi.

location ~* /admin/(.*) {
  ...
  rewrite .* /$1 break;
  proxy_pass http://127.0.0.1:9000;
}

(.*)desde la primera línea se recupera en el bloque como $1. La idea es recuperar el URI después admin/y reemplazar todo con ese URI.

información relacionada