You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Nginx反向代理解决iframe加载HTTP摄像头流的混合内容阻塞问题

Nginx反向代理解决iframe加载HTTP摄像头流的混合内容阻塞问题

没问题,这种浏览器阻止混合内容的情况太常见了——因为你的主页面是HTTPS协议,却要加载HTTP的摄像头流,浏览器出于安全策略会直接拦截。用Nginx做反向代理把HTTP流转成HTTPS是完全可行的,结合你已经有的DuckDNS域名和Let's Encrypt证书,我来帮你调整正确的Nginx配置。

首先,修正你的配置文件,正确的/etc/nginx/sites-available/c500.duckdns.org应该是这样的:

# 处理HTTP请求,自动重定向到HTTPS
server {
    listen 80;
    server_name c500.duckdns.org;

    # 把所有HTTP请求301永久重定向到HTTPS,从根源避免混合内容触发
    return 301 https://$server_name$request_uri;
}

# 处理HTTPS请求,代理摄像头实时流
server {
    listen 443 ssl;
    server_name c500.duckdns.org;

    # 你的Let's Encrypt证书路径,请确认路径与实际一致
    ssl_certificate /etc/letsencrypt/live/npm-3/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/npm-3/privkey.pem;

    # 可选:添加基础SSL安全配置,提升连接安全性
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # 专门代理摄像头WebRTC流的location
    location /backyard {
        # 指向树莓派上Wyze-Bridge的HTTP流地址
        proxy_pass http://10.0.0.16:8889/backyard;
        
        # 关键代理头,确保后端服务能正确识别请求来源
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # WebRTC专属配置:支持WebSocket握手和长连接
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 86400; # 延长超时时间适配实时流
    }

    # 如果你的Weather Observations-II页面也部署在该服务器,可添加此块
    # location / {
    #     proxy_pass http://你的主页面服务地址;
    #     proxy_set_header Host $host;
    #     ...其他必要代理头
    # }
}

给你解释几个核心要点:

  • HTTP转HTTPS重定向:第一个server块直接把所有HTTP请求跳转到HTTPS,避免用户访问HTTP版本页面,从源头减少混合内容风险。
  • 独立的/backyard路由:单独为摄像头流设置location,不会影响域名下的其他服务(比如你的天气观测页面)。
  • WebRTC适配配置:因为你的流是WebRTC协议,必须添加HTTP/1.1和WebSocket升级头,否则实时流的握手会失败,无法正常加载。
  • 证书路径验证:确认你的Let's Encrypt证书路径正确,若使用其他工具生成证书,需对应修改路径。

配置完成后,执行以下命令验证配置并重启Nginx:

# 测试Nginx配置语法是否正确
sudo nginx -t

# 测试通过后,重启Nginx生效
sudo systemctl restart nginx

最后修改你的iframe代码,把资源地址换成HTTPS版本:

<iframe width="1300" height="731" src="https://c500.duckdns.org/backyard"></iframe>

这样浏览器会识别加载的是HTTPS资源,就不会再拦截混合内容,你的摄像头流应该就能正常显示在iframe里了。

备注:内容来源于stack exchange,提问作者William

火山引擎 最新活动