我将其用作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
同一登录页面,我必须再次登录。可以避免这种双重登录吗?
答案1
不要设置proxy_redirect
为off
,那不是做你认为它正在做的事情。 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/
在其他地方。但即便如此,默认参数也可以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(而不是nginx
IP)并X-Forwarded-Proto
检查客户端是否nginx
通过 HTTP 或 HTTPS 连接到。