我有一个 https 网站,需要呈现仅适用于 http 的外部网站的 iframe。外部 http 端点都在 URL 内,例如:http://external-website.com/foobar
浏览器不允许这种情况(混合内容错误。https 里面的 http...),所以我配置了我的 https 网站 nginx 在 url /foobar 上创建反向代理来解决这个问题。
现在我调用 url:https://my-website/foobar,这样就可以正确呈现 iframe。
问题是:iframe 应用程序内的某些按钮调用硬核 http,并且在我的网站内,当我单击这些按钮时,它会调用 http://my-website/foobar(我设置的反向代理,但使用 http 而不是 https)这给了我混合内容错误并且按钮不起作用
我需要某种方法来强制所有通过 /foobar 的请求使用 https。
这是我当前的 nginx.conf
server {
listen 80 default_server;
if ($http_x_forwarded_proto = "http") {
return 301 https://$host$request_uri;
}
location /foobar/ {
proxy_pass http://external-website.com/foobar/;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
}
}
答案1
为了实现这一点,你必须能够修改页面的内容,其中 ngx_http_sub_module变得方便。
该
ngx_http_sub_module
模块是一个过滤器,它通过用另一个指定的字符串替换一个指定的字符串来修改响应。该模块不是默认构建的,需要通过
--with-http_sub_module
配置参数启用。
例如,Debian 12 和 Ubuntu 22.04 在打包版本的 Nginx 上都启用了此模块,您可以使用 来确认nginx -V
。(如果没有,则需要自行编译 Nginx。)
之后,可以用以下方式替换内容:
location /foobar/ {
sub_filter 'http://example.net/' 'https://$host/foobar/';
sub_filter_once off;
}