如何修复DNN站点模块编辑/设置弹窗iframe的HTTP/HTTPS URL生成错误
这个问题核心是生产环境部署了SSL卸载架构:HTTPS请求先在负载均衡、CDN或WAF层完成SSL证书校验解密,之后这层设备回源请求DNN应用服务器时走的是HTTP协议,DNN进程收到的请求本身就是HTTP的,自然默认按HTTP拼接所有内部URL,模态弹窗里的iframe src就成了HTTP开头,直接触发浏览器混合内容拦截,控制台抛出对应报错:
Mixed Content: The page at "" was loaded over HTTPS, but requested an insecure frame. This request has been blocked; the content must be served over HTTPS.
本地环境没有中间的SSL卸载层,HTTPS请求直接打到DNN应用进程,所以能正常生成HTTPS链接,和观察到的本地正常、生产异常的现象完全吻合。之前查到的官方方案里提到的禁用模态弹窗属于回避问题,会破坏模块编辑、设置的正常功能,完全没必要采用。
全部是DNN原生支持的配置,不需要改业务代码,也不用加临时meta标签凑数,按顺序配置即可:
- 先打通请求头透传:确认前置的负载均衡/CDN/WAF回源时会携带
X-Forwarded-Proto: https请求头,向后端服务标识原始请求的协议为HTTPS;如果用IIS托管DNN,检查站点配置没有拦截或覆盖这个请求头,保证头信息能正常传递到DNN进程。 - 开启DNN原生SSL卸载适配:用超级管理员账号登录后台,进入安全设置下的基本配置页,在SSL设置区块勾选*SSL Offloading(SSL卸载)*选项,根据站点运营需要同步开启全站强制SSL,保存配置后回收对应站点的应用程序池。配置生效后DNN会自动识别透传的协议头,所有调用内置URL生成方法的逻辑(包括模块编辑、设置弹窗的iframe地址生成)都会按原始请求的HTTPS协议拼接地址。
- 做兜底配置校验:进入站点别名配置页,把所有HTTP开头的站点别名设置为自动重定向到HTTPS,主站点别名固定为HTTPS开头的完整域名,避免DNN读取别名配置时错用HTTP协议。
之前通过PersonaBar添加meta标签让浏览器自动升级HTTP请求的方案属于临时权宜之计,本质是靠浏览器端拦截替换请求协议,一方面没法覆盖所有动态URL场景,另一方面如果个别资源暂不支持HTTPS会直接加载失败,不适合作为长期方案。
模块编辑、设置弹窗的URL都是DNN内置方法统一生成的,只要上述配置生效,所有这类动态生成的URL都会自动修正为HTTPS,不需要单独调整每个模块的代码。配置完成后可按如下路径验证:用超级管理员账号登录进入页面编辑模式,悬停任意模块点击编辑或设置按钮,弹出的模态框iframe地址会自动生成为HTTPS协议,不会再触发混合内容报错。
内容的提问来源于stack exchange,提问作者Constantine Ketskalo

