3

I want to change the url of a request but the browser address should not change. To achieve this I have tried the below configuration:

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

Although doing this the request does get the correct address but the address bar of the browser also changes.

Also tried;

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

Any suggestion(s) on improving this configuration?

Expected Output

address bar: protocol://localhost/my-website

actual: protocol://localhost/my-website/page

Current Output

address bar: protocol://localhost/my-website/page

actual: protocol://localhost/my-website/page

Things tried :

Edit

The above issue is being faced on a 302 redirect. For other cases the url is changed without changing the browser address. I am handling the latter case using the below config:

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

i.e. that location is followed by /src and it works.

In the 302 case the location is just my-website/ and the above tried things fail.

My file config:

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; } } } 

Logs

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" "-"- 
2
  • i'm testing with the configuration similar to yours and it work well for me can you add variable $upstream_http_location in nginx access log and share it in here? and maybe give us full config? Commented Aug 31, 2018 at 11:33
  • @IlhamSulaksono sure i will upload it Commented Sep 3, 2018 at 6:16

2 Answers 2

2

Your rewrite logic is fine since its working correctly in normal schenerio. Browser URL is changing for 302 redirect because rewrite directive just changes the request URI, not the response of request.

A typical 302 reponse looks like this:

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

Location header in 302 response forces the browser to follow mentioned url.

Possible solution is to modify Location header from the proxied response (in case of 302 redirect) using proxy_redirect directive

Helpful links:

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

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

0

Try this:

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

I think you have a $ out of place in your regexp - it should be at the end of the regexp. I can't tell exactly what your intentions are but you might also want to change your rewrite target, so that pages other than index.html will work:

location /my-website { proxy_pass http://tomcat:8000; rewrite /my-website(.*)$ /my-website/page$1 break; } 
3
  • 1
    To extend on this answer: Your rewrite of rewrite /my-website$(.*) is basically saying that the URL ends at /my-website as $ is the symbol for end-of-line in PCRE. Nginx uses the PCRE library during compilation. A good place to test out your regex is at regex101.com Commented Aug 31, 2018 at 14:03
  • just tried your solution. the url is correctly re written however the browser address is also changed. i don't know if it will help but the re write is to happen on a 302 server redirect. For other cases the following config works fine proxy_passdocker-iam; rewrite ^(.*)iam/src(.*)$ $1iam/$ua_redirect/src$2 break; Commented Sep 3, 2018 at 6:14
  • i will add this to the question as well Commented Sep 3, 2018 at 6:15

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.