所以我已经设置了一个反向代理来隧道我的应用程序。
不幸的是,应用程序认为它是通过http而不是https提供的,并给出了端口80的URL。
如何在nginx反向代理中处理此问题? (可能通过重写)
当我进入页面时:
https://my.server.com
index.php加载,一切正常
单击某些内容后,我会有一个类似这样的URL:
https://my.server.com:80/page/stuff/?redirect_to
这会在浏览器内引发错误,因为我的反向代理不在端口80上提供SSL。
我该如何缓解?
我当前用于该站点的nginx ssl虚拟主机:
... ssl stuff ...
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
location / {
proxy_pass http://localhost:22228;
proxy_buffering off;
proxy_redirect off;
proxy_read_timeout 43800;
proxy_pass_request_headers on;
proxy_set_header Connection "Keep-Alive";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Port 443;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass_header Content-Type;
proxy_pass_header Content-Disposition;
proxy_pass_header Content-Length;
proxy_set_header X-Forwarded-Proto https;
}
(是的,我知道我的请求标头看起来像一棵圣诞树🎄)
如果您显示解决此问题的文档在哪里以及该机制的名称,也可以得到加分。
对于重写响应正文,您可以使用http_sub_module
:
http_sub_module
[许多人说,使用location /blog/ {
proxy_pass http://127.0.0.1:8000/;
sub_filter_once off;
sub_filter_types text/css application/javascript; # in addition to text/html
sub_filter "//my.server.com:80/" "//my.server.com/";
}
指令时需要禁用压缩:
sub_filter
对我来说,它在配置中没有此行就可以正常工作,但是它可以是我使用的OpenResty的功能,而不是nginx。
[如果您的应用程序生成HTTP 30x重定向,并明确指示domain:port,则可以使用 proxy_set_header Accept-Encoding "";
指令重写Location
标头值:
proxy_redirect