Nginx反向代理重定向


14

nginx用作反向代理,当我在Web界面中登录时,我被重定向到代理URL。我想避免这种情况,并始终将“ server_name”保留为URL。可能吗?

这是我的/etc/nginx/conf.d/my_app.conf

server { 
    listen 443 ssl; 
    server_name my-app.net; 
    ssl_certificate /etc/pki/tls/certs/my-app.cer; 
    ssl_certificate_key /etc/pki/tls/private/my-app.key; 
    ssl_protocols TLSv1.1 TLSv1.2; 
    access_log /var/log/nginx/my-app.access.log main; 

    location / { 
        proxy_pass http://ip_of_the_app:7180/; 
        proxy_redirect off; 
    } 
} 

我连接上http://my-app.net,输入登录信息,然后将我重定向到http://ip_of_the_app:7180同一登录页面,然后必须再次登录。可以避免这种双重登录吗?


tonio94,您的问题是否得到解决?如果是,请接受答案。如果否,请说明缺少的内容。
cnst 2016年

2
我昨天刚刚测试过,它可以正常工作,需要删除proxy_redirect。谢谢您的帮助。
tonio94'7

Answers:


27

不要设置proxy_redirectoff,即没有按照您认为的那样做。 proxy_redirect执行类似于URL重写的操作,例如:

location /sales/ { 
    proxy_pass http://ip_of_the_app:7180/; 
    proxy_redirect http://ip_of_the_app:7180/ http://$host/sales/; 
}

这使您可以将/sales/路径托管在其他位置。但是即使如此,默认参数for proxy_redirect还是为您免费提供的。默认是将位置重定向到其中存在的任何位置proxy_pass(并且当您未设置时使用默认参数proxy_redirect或使用,proxy_redirect default;)。

您不需要设置 proxy_redirect


您缺少的是需要发送到应用程序的标头。其中最重要的是HOST。这将根据需要执行代理,并在浏览器中保留正确的URL。

location / { 
    proxy_pass http://ip_of_the_app:7180/; 
    proxy_set_header HOST $host;
}

请注意,位于的应用程序http://ip_of_the_app:7180/现在将收到带有Host: my-app.net标头。


您还应该考虑使用更多的标头:

proxy_set_header Referer $http_referer;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;

这样可以更好地在的应用程序内部登录http://ip_of_the_app:7180/X-Forwarded-For提供实际客户端的IP(而不是nginxIP),并X-Forwarded-Proto检查客户端是否nginx通过HTTP或HTTPS 连接到。


谢谢你的帮助。不需要proxy_redirect,但必须设置proxy_set_header引用人ip_of_the_app:7180才能正常工作。
tonio94 '16

@ tonio94-谢谢,我更新了答案。请注意,的正常用法Referer只是$http_referer从请求中复制它。如果请求没有Referer标头,则该方法不起作用,因此在某些情况下,对其进行硬编码是一种解决方案。
俗的

@JonathanKomar-谢谢你,你是正确的,现在已编辑。抱歉,我花了一段时间注意到您的评论。
grochmal

@grochmal谢谢,您基本上通过以下信息拯救了我的命:proxy_set_header HOST $ host;
Obay Abd-Algader
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.