nginx reescribe la URL sin cambiar la dirección del navegador

nginx reescribe la URL sin cambiar la dirección del navegador

Quiero cambiar la URL de una solicitud pero la dirección del navegador no debería cambiar. Para lograr esto, he probado la siguiente configuración:

location /my-website {          

    proxy_pass  http://tomcat/my-website;
}

location =/my-website { 

        rewrite /my-website$(.*) $1/my-website/mypage/index.html last;

}

Aunque al hacer esto, la solicitud obtiene la dirección correcta, pero la barra de direcciones del navegador también cambia.

También lo intenté;

location /my-website {                  
    proxy_pass  http://tomcat;
    rewrite /my-website$(.*) $1/my-website/page/index.html break;

}

¿Alguna sugerencia para mejorar esta configuración?

Rendimiento esperado

Barra de dirección:protocolo://localhost/mi-sitio web

actual:protocolo://localhost/mi-sitio-web/página

Salida de corriente

Barra de dirección:protocolo://localhost/mi-sitio-web/página

actual:protocolo://localhost/mi-sitio-web/página

Cosas probadas:

Editar

El problema anterior se enfrenta en una redirección 302. Para otros casos, la URL se cambia sin cambiar la dirección del navegador. Estoy manejando el último caso usando la siguiente configuración:

location /my-website {      

        proxy_pass  http://tomcat;
        rewrite ^(.*)my-website/src(.*)$ $1my-website/page/src$2 break;


    }

es decir, esa ubicación va seguida de /src y funciona.

En el caso 302, la ubicación es solo mi-sitio web/ y las cosas intentadas anteriormente fallan.

Mi archivo de configuración:

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;



    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"' 
                      '"$upstream_http_location"';    

    rewrite_log  on;

    #log_format  graylog2_format  '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for" <msec=$msec|connection=$connection|connection_requests=$connection_requests|millis=$request_time>';

    error_log logs/error.log warn;

    sendfile        on;

    keepalive_timeout  65;

    map $http_user_agent $ua_redirect {
    default 'abc';        
    }



    upstream docker-mysite {
        server localhost:9012;
    }


    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;
    proxy_set_header     X-Forwarded-Proto $scheme;
    proxy_read_timeout   900;

    client_max_body_size 0; 

server {
    listen       80;      


    access_log  logs/host.access.log  main; 

    #below config works
    location /mysite {                      
        proxy_pass  http://docker-mysite;
        rewrite ^(.*)mysite/src(.*)$ $1mysite/$ua_redirect/src$2 break;

    }
    #below config works but modifies the browser url hence the issue
    location = /mysite {    
        proxy_pass  http://docker-mysite;               
        rewrite /mysite(.*)$ /mysite/$ua_redirect$1 break;

    }

}

}

Registros

127.0.0.1 - - [03/Sep/2018:11:46:07 +0500] "GET /mysite/login?code=token HTTP/1.1" 302 0 "http://localhost/loginapp/web/index.html" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" "-"http://localhost/mysite/abc
127.0.0.1 - - [03/Sep/2018:11:46:07 +0500] "GET /mysite/abc HTTP/1.1" 404 0 "http://localhost/loginapp/web/index.html" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36" "-"-

Respuesta1

Su lógica de reescritura está bien ya que funciona correctamente en un esquema normal. La URL del navegador está cambiando para la redirección 302 porque rewritela directiva simplemente cambia el URI de la solicitud, no la respuesta de la solicitud.

Una respuesta 302 típica se ve así:

HTTP/1.1 302 Found
Location: http://overrideurlrewriting.com

LocationEl encabezado en la respuesta 302 obliga al navegador a seguir la URL mencionada.

La posible solución es modificar Locationel encabezado de la respuesta proxy (en caso de redirección 302) usando proxy_redirectla directiva

Enlaces Útiles:

https://stackoverflow.com/a/26025618/2073920

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect

Respuesta2

Prueba esto:

location /my-website {                  
    proxy_pass  http://tomcat;
    rewrite /my-website(.*)$ $1/my-website/page/index.html break;
}

Creo que tienes un $fuera de lugar en tu expresión regular; debería estar al final de la expresión regular. No puedo decir exactamente cuáles son sus intenciones, pero es posible que también desee cambiar su objetivo de reescritura, para que otras páginas index.htmlfuncionen:

location /my-website {
    proxy_pass  http://tomcat:8000;
    rewrite /my-website(.*)$ /my-website/page$1 break;
}

información relacionada