织梦https部署后图片打不开
站点从 HTTP 升级到 HTTPS 后,页面上的图片突然变成破图,控制台一堆“Mixed Content”报错——这是织梦 https 改造里最高频的故障。根因是图片 URL 还停留在 http:// 开头,浏览器在 https 页面里拒绝加载 http 资源。本文给出完整排查和修复方案。
一、问题根因分析
织梦图片地址来自三个层面,每一层都可能残留 http:
- 数据库存储 ——
dede_archives.litpic、dede_addonarticle.body等字段里存的是绝对路径http://www.xxx.com/uploads/... - 系统参数 —— 后台“站点根网址”配的还是
http:// - 模板硬编码 —— 模板里 logo、背景图写死了
http://
浏览器在 https 页面加载 http 图片时,会直接拦截并报 Mixed Content 错误,图片就显示不出来。
二、第一步:修改系统参数
登录织梦后台 → 系统 → 系统基本参数 → 站点设置:
- 把“站点根网址”从
http://www.xxx.com改成https://www.xxx.com - 把“网页主页链接”改成
https://www.xxx.com - 把“附件站点”改成
https://www.xxx.com(如果有这项)
改完保存。这样新发布的文档生成的图片 URL 会用 https。但已经发布的旧文档数据库里还是 http,需要下一步批量替换。
三、第二步:数据库批量替换 http 为 https
这是最关键的一步。需要替换的表和字段:
1. 文章主表 litpic 字段
UPDATE dede_archives SET litpic=REPLACE(litpic, 'http://www.xxx.com', 'https://www.xxx.com')
WHERE litpic LIKE 'http://%';
2. 文章附加表 body 字段(内容里的图片)
UPDATE dede_addonarticle SET body=REPLACE(body, 'http://www.xxx.com', 'https://www.xxx.com')
WHERE body LIKE 'http://%';
3. 软件模型的字段
UPDATE dede_addonsoft SET introduce=REPLACE(introduce, 'http://www.xxx.com', 'https://www.xxx.com')
WHERE introduce LIKE 'http://%';
4. 栏目封面描述
UPDATE dede_arctype SET content=REPLACE(content, 'http://www.xxx.com', 'https://www.xxx.com')
WHERE content LIKE 'http://%';
四、第三步:检查模板硬编码
模板里常见的 http 残留位置:
head.htm—— logo 图片、faviconfooter.htm—— 底部友情链接、统计代码index.htm—— 幻灯片图片- CSS 文件里的
background:url(http://...) - 统计代码(百度统计、CNZZ)—— 早期代码是 http 协议
用编辑器全局搜索 http://,逐个替换成 //(协议相对路径)或 https://。推荐用 //,自动适配当前页面协议:
<img src="//www.xxx.com/logo.png">
background:url(//www.xxx.com/images/bg.png)
五、第四步:重新生成静态页
织梦是静态生成机制,数据库改完后,必须重新生成 HTML 才能让页面输出新的 https 链接:
- 后台 → 生成 → 更新主页 HTML
- 后台 → 生成 → 更新栏目 HTML(全选)
- 后台 → 生成 → 更新文档 HTML(按时间全量)
如果文档量大(万级以上),生成会比较慢,可以分栏目批量生成,避免 PHP 超时。
六、第五步:CDN 与对象存储适配
如果图片走 CDN 或 OSS/COS 对象存储,要同步处理:
- CDN 控制台开启 HTTPS 加速,配置回源协议为 HTTPS
- CDN 域名要绑定 SSL 证书,否则 https 访问 CDN 会报错
- OSS/COS 的访问域名从
http://bucket.oss-cn-xxx.aliyuncs.com改成https:// - 如果用了自定义域名,确保自定义域名也配了证书
七、第六步:开启 HSTS(可选加固)
为防止用户第一次访问时被中间人降级到 http,在 nginx/apache 加 HSTS 头:
# nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
浏览器收到后会记住一年内只走 https,不再尝试 http。但要注意:开启 HSTS 前必须确认全站 https 完全正常,否则会导致用户无法访问残留的 http 资源。
八、验证清单
- 浏览器 F12 → Console 无 Mixed Content 报错
- 地址栏锁形图标显示“安全”,无黄色三角警告
- 查看页面源码,搜索
http://应只剩外链(如友情链接对方站点) - 用 SSL Labs(ssllabs.com)检测评分达 A 以上
- 百度站长平台提交 https 认证,等待 https 收录
九、注意事项
- 替换 SQL 里域名要写完整(含 www),避免误伤相对路径
- 如果同时有带 www 和不带 www 的域名,两个都要替换
- 采集进来的外站图片地址是别人的 http,无法替换,建议下载到本地再上传
- 会员头像、评论图片等用户上传内容也要检查
- 百度 https 认证提交后,http 和 https 会并存一段时间,301 重定向要配好
HTTPS 改造不是改个证书就完事,图片地址的彻底 https 化才是重头戏。建议改造完成后写一个定时脚本,每周扫描数据库新增内容里是否还有 http 残留,从源头堵住。把 https 作为站点基线,后续所有新功能、新模板都默认走 https,避免反复返工。