58

What I want to do is,

When someone visit http://localhost/route/abc the server response exactly the same as http://localhost:9000/abc

Now I configure my Nginx like this:

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

The http request is dispatched port 9000 correctly, but the path it received is http://localhost:9000/route/abc not http://localhost:9000/abc.

Any suggestion ?

60

I hate the subtlety here, but try adding a / at the end of 9000 like below. It will no longer append "route" to the forwarded request now.

location /route {
    proxy_pass  http://127.0.0.1:9000/;
}
  • 4
    This should be the accepted answer. Simply adding / is well documented as the way to remove the prefix listed in the location. – Bernard Sep 12 '16 at 12:39
36

I believe you can use rewrite to remove the extra part of the URL. In your case I think you could use:

location /route/ {
    rewrite ^/route/?(.*)$ /$1 break;    
    proxy_pass  http://127.0.0.1:9000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

However if your app has internal links in it, they may still point to /abc/foo , and if you do this they instead need to point to /route/abc/foo so that the raw request comes in correctly. You may be better off leaving the nginx config as it is and instead configuring your app to be aware it lives at a subdirectory, if you can.

I know this is an old question, but it was the top google hit for me when I was trying to solve the same issue!

15

Try the following

location /route/ {
        proxy_pass  http://127.0.0.1:9000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
  • This solution worked best for me, as it preserves the host name. – Shafique Jamal Sep 29 '18 at 20:18
  • Clean and simple. – Ravshan Samandarov Mar 15 at 11:24
7

vim nginx.conf

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

  server {
    listen 8080;

    location / {
      proxy_pass http://compute-1-36:8787;
      proxy_redirect http://compute-1-36:8787/ $scheme://$host:8080/;
    }
  }

This code listen on 8080 and redirect to port 8787 on compute-1-36. You can select other path in location /

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.