My problem is very similar to this: nginx proxy pass redirects ignore port

I am using nginx 1.0.14.

I want to be able to ssh-tunnel into my Django website, so I can work remotely. I've tested a simple Django project on my personal computer, with very simple nginx configuration (starter, default). I tunnel and redirection returns with port number as part of the url. So I am sure this is not a Django problem. It's mainly my nginx configuration.

Here is the relevant part.

server {
    listen 80;
    server_name localhost;
    server_name_in_redirect off;

# location other services go here

location ~ /forum/(.*)$ {
    #rewrite ^(.*):(.*)/forum(.*)$ /$2 last;
    #rewrite ^(.*)$ http://localhost:8000/$1;
    #rewrite ^/forum(.*)$ $1 break;

    # the forum service runs as local, listens to 8000 port...
    proxy_pass http://localhost:8000;
    proxy_redirect default;

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

So what happen if I ssh-tunnel?

ssh -L 1111: username@server-address -N

then open the browser, http://localhost:1111, and when I login, or do anything that requires redirection, I get http://localhost/forum/front-page instead of http://localhost:1111/froum/front-page

These links are wrong, nginx will complain (from the server side) they do not exist.

Internally, the service forum runs at http://localhost:8000

I've tried stuff like

proxy_set_header $host:$server_port;  # or
proxy_set_header $proxy_host:$proxy_port;  # or
proxy_set_header $host:$proxy_port;  # or
rewrite ^(.*):(.*)/forum(.*)$ /$2 last;
#rewrite ^/forum(.*)$ $1 break;
proxy_redirect http://localhost/ http://$host:$proxy_port;

The 2nd proxy_set_header shows a little progress. After pressing submit, I get a blank page, with the original url (http://localhost:1111/post and then I see the same url again).

Any idea how to resolve my problem? Thanks.


So I came up with a simple solution...as my own answer...

proxy_set_header Host $host;

$host should be replaced with $http_host, although I am not quite sure the meaning of either.

  • 1
    $host only prints the hostname, $http_host prints hostname:portnumber – Luuk Nov 24 '14 at 9:15

You need to enable proxy_redirect It rewrites the host header of the response to prevent the problem you're facing. Setting it to default should do the trick.

  • I did have proxy_redirect to default. Please look at the first code snippet. It shows that I have those criteria. But they didn't solve my problem. I heard that my solution (posted as an answer) is dangerous. – CppLearner May 26 '12 at 21:31

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.