赞片CMShttps混合内容
照着做完这篇,你能把赞片CMS站点从"HTTPS 挂锁但页面一堆资源加载失败"的状态,修成浏览器地址栏干干净净、控制台没有 Mixed Content 警告的状态。
混合内容(Mixed Content)的本质很简单:页面本身是 https:// 打开的,但里面还引用着 http:// 的资源。浏览器为了安全,会把图片、CSS、JS 这类"被动内容"拦掉,把 iframe、XHR、播放地址这类"主动内容"直接阻断,表现就是图片裂开、样式错乱、播放器转圈。
第一步:先用浏览器确认到底坏了什么
打开你的站点首页和任意一部影片详情页,按 F12 打开开发者工具,切到 Console 面板。
你会看到类似这样的红字:
Mixed Content: The page at 'https://你的域名/' was loaded over HTTPS,
but requested an insecure image 'http://你的域名/uploads/xxx.jpg'.
This request has been blocked.
记下被拦的域名和路径。再看 Network 面板,点一下 Protocol 列(没有的话右键表头勾上),凡是显示 http/1.1 的行就是罪魁祸首。
这一步做完,你会拿到一张清单:到底是自己域名下的图挂了,还是第三方图床、还是播放地址挂了。
注意:不要只刷首页就下结论。赞片CMS 的模板通常有首页、列表页、详情页、播放页四套模板,播放页最容易出问题,因为它涉及 m3u8/播放器 JS。
第二步:搞清 http 地址藏在哪三个地方
赞片CMS 里的 http:// 通常来自三处,必须逐个清:
- 数据库——采集来的影片数据、封面图地址、配置表里的站点 URL,大多是写死的绝对地址。
- 模板文件——
template/目录下写死的http://图片、CDN、统计代码。 - 第三方外链——弹幕、统计、广告联盟、采集接口,这些是别人给的,你改不了。
先在服务器上跑一遍扫描(路径按你实际安装目录改):
cd /www/wwwroot/你的域名
grep -rn "http://" template/ | grep -v "https://" | head -50
这一步的结果会告诉你模板里有多少处需要手工改。
第三步:批量替换数据库里的 http
先进 phpMyAdmin 或命令行 mysql -u用户 -p,选你的赞片CMS数据库。
先查再改,别直接下手:
SELECT COUNT(*) FROM 影片表名 WHERE 封面字段 LIKE 'http://%';
确认数量对得上,再执行替换:
UPDATE vod SET vod_pic = REPLACE(vod_pic, 'http://', 'https://') WHERE vod_pic LIKE 'http://%';
赞片CMS 的表名前缀一般是 zanpian_ 开头,影片表多为 vod 系列,具体以 SHOW TABLES; 的结果为准。要改的字段通常有:封面图、缩略图、播放地址、站点配置里的 URL。
注意:替换前务必用 phpMyAdmin 的导出功能备份整库。
REPLACE是不可逆的,一旦把别的http://也换掉,比如某些必须走 http 的老接口,就只能靠备份回滚。
改完清一次缓存(赞片CMS后台一般有「系统 → 缓存管理 → 清除缓存」这类入口,版本不同叫法略有差异)。
第四步:改模板里写死的 http
模板文件用 sed 批量替换,但要排除掉那些必须保留 http 的第三方地址:
sed -i 's|http://你的域名|https://你的域名|g' template/*/*.html
sed -i 's|http://cdn.你的域名|https://cdn.你的域名|g' template/*/*.html
只替换你自己的域名,别用 s|http://|https://|g 这种全局替换——那会把统计代码、采集接口一起改坏。
改完去后台再清一次模板缓存,或者直接删 runtime/、cache/ 下的编译文件。
注意:如果你的图片存在第三方图床或对象存储上,光改页面没用,得去图床控制台开启 HTTPS 访问,再把域名换过去。很多老图床默认只有 http,这是最容易卡住的一环。
第五步:用 CSP 兜底,但别指望它解决全部
在 Nginx 站点的 server 块里加一行:
add_header Content-Security-Policy "upgrade-insecure-requests";
然后 nginx -t && nginx -s reload。
这行的作用是:浏览器遇到 http 资源时自动尝试用 https 再请求一次。
注意:它只能救"同一个域名且确实支持 https"的资源。如果对方服务器根本没有证书,升级请求照样失败。而且它救不了 iframe 和 XHR 这类主动内容。所以这行是兜底,不是替代方案。
小结
- 先用 F12 的 Console 和 Network 面板列出所有被拦的 http 资源,别瞎改。
- 三处来源:数据库、模板文件、第三方外链,缺一处都修不干净。
- 数据库替换前必须导出备份,
REPLACE不可逆。 - 模板替换只针对自己的域名,不要全局
http://→https://。 - 第三方图床、播放器、统计代码要单独去对方后台开 HTTPS。
- CSP 的
upgrade-insecure-requests只是兜底,不能替代前面几步。
原文链接:https://www.gj0.com/thread-1225.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。