使用 nginx 将 iframe 内的 http 调用重定向到 https

使用 nginx 将 iframe 内的 http 调用重定向到 https

我有一个 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;
}

相关内容