
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:
- https://www.claudiokuenzler.com/blog/436/nginx-rewrite-url-examples-with- without-redirect-address#.W3_a6M4zaUk
- https://stackoverflow.com/questions/15322826/nginx-rewrite- without-change-url
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 rewrite
la 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
Location
El encabezado en la respuesta 302 obliga al navegador a seguir la URL mencionada.
La posible solución es modificar Location
el encabezado de la respuesta proxy (en caso de redirección 302) usando proxy_redirect
la 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.html
funcionen:
location /my-website {
proxy_pass http://tomcat:8000;
rewrite /my-website(.*)$ /my-website/page$1 break;
}