Sign up ×

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
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.

share|improve this question

2 Answers 2

up vote 5 down vote accepted

So I came up with a simple 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.

share|improve this answer
$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.

share|improve this answer
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


