proxy_pass - nginx rewrite response
¿Cómo reescribo las URL en una respuesta proxy en NGINX? (3)
Estoy acostumbrado a usar Apache con mod_proxy_html, y estoy tratando de lograr algo similar con NGINX. El caso de uso específico es que tengo una IU de administrador ejecutándose en Tomcat en el puerto 8080 en un servidor en el contexto raíz:
http://localhost:8080/
Necesito mostrar esto en el puerto 80, pero tengo otros contextos en el servidor NGINX que se ejecuta en este host, así que quiero intentar acceder a esto en:
http://localhost:80/admin/
Esperaba que el siguiente bloque de servidor súper simple lo hiciera, pero no es así:
server {
listen 80;
server_name screenly.local.akana.com;
location /admin/ {
proxy_pass http://localhost:8080/;
}
}
El problema es que el contenido devuelto (html) contiene URL a scripts e información de estilo a la que se accede en el contexto raíz, por lo que necesito reescribir estas URL para comenzar con / admin / en lugar de /.
¿Cómo hago esto en NGINX?
Primero debemos leer la documentación de proxy_pass con cuidado y en su totalidad.
El URI pasado al servidor ascendente se determina en función de si la directiva "proxy_pass" se usa con URI o no.
La barra diagonal final en la directiva proxy_pass significa que el URI está presente y es igual a
/
.
La ausencia de barra inclinada significa que el URI del sombrero está ausente.
Proxy_pass con URI :
location /some_dir/ {
proxy_pass http://some_server/;
}
Con lo anterior, existe el siguiente proxy:
http:// your_server/some_dir/ some_subdir/some_file ->
http:// some_server/ some_subdir/some_file
Básicamente,
/some_dir/
se reemplaza por
/
para cambiar la ruta de solicitud de
/some_dir/some_subdir/some_file
a
/some_subdir/some_file
.
Proxy_pass sin URI :
location /some_dir/ {
proxy_pass http://some_server;
}
Con el segundo (sin barra diagonal): el proxy es así:
http:// your_server /some_dir/some_subdir/some_file ->
http:// some_server /some_dir/some_subdir/some_file
Básicamente, la ruta de solicitud original completa se pasa sin cambios.
Entonces, en su caso, parece que simplemente debe soltar la barra inclinada final para obtener lo que desea.
Consideración
Tenga en cuenta que la reescritura automática solo funciona si no utiliza variables en proxy_pass. Si usa variables, debería reescribirse:
location /some_dir/ {
rewrite /some_dir/(.*) /$1 break;
proxy_pass $upstream_server;
}
Hay otros casos en los que la reescritura no funcionaría, por eso es imprescindible leer la documentación.
Editar
Al leer su pregunta nuevamente, parece que me perdí que solo desea editar la salida html.
Para eso, puede usar la directiva sub_filter . Algo como ...
location /admin/ {
proxy_pass http://localhost:8080/;
sub_filter "http://your_server/" "http://your_server/admin/";
sub_filter_once off;
}
Básicamente, la cadena que desea reemplazar y la cadena de reemplazo
Puede usar el siguiente ejemplo de configuración de nginx:
upstream adminhost {
server adminhostname:8080;
}
server {
listen 80;
location ~ ^/admin/(.*)$ {
proxy_pass http://adminhost/$1$is_args$args;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
También es posible que necesite establecer la siguiente directiva antes del primer "sub_filtro" para servidores de fondo con compresión de datos:
proxy_set_header Accept-Encoding "";
De lo contrario, puede que no funcione. Para su ejemplo se verá así:
location /admin/ {
proxy_pass http://localhost:8080/;
proxy_set_header Accept-Encoding "";
sub_filter "http://your_server/" "http://your_server/admin/";
sub_filter_once off;
}