我的问题与此非常相似:nginx 代理传递重定向忽略端口
我正在使用 nginx 1.0.14。
我希望能够通过 ssh 隧道进入我的 Django 网站,这样我就可以远程工作了。我在个人电脑上测试了一个简单的 Django 项目,使用非常简单的 nginx 配置(starter,默认)。我建立隧道,重定向返回时将端口号作为 url 的一部分。所以我确信这不是 Django 的问题。这主要是我的 nginx 配置。
以下是相关部分。
server {
listen 80;
server_name localhost 127.0.0.1;
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;
}
那么如果我使用 ssh-tunnel 会发生什么情况?
ssh -L 1111:192.168.1.165:80 username@server-address -N
然后打开浏览器http://localhost:1111
,当我登录或执行任何需要重定向的操作时,我得到http://localhost/forum/front-page代替 http://localhost:1111/fromum/front-page
这些链接是错误的,nginx 会抱怨(从服务器端)它们不存在。
在内部,服务论坛运行于http://localhost:8000
我尝试过
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;
第二个 proxy_set_header 显示了一些进度。按下 后submit
,我得到一个空白页,其中包含原始网址(http://本地主机:1111/post然后我再次看到相同的网址)。
有办法解决我的问题吗?谢谢。
答案1
所以我想出了一个简单的解决方案......作为我自己的答案......
proxy_set_header Host $host;
$host
应该替换为$http_host
,尽管我不太清楚它们的含义。
答案2
您需要启用代理重定向它重写响应的主机标头以防止您遇到的问题。将其设置为默认值应该可以解决问题。