HTTPS 改造排错

织梦https部署后图片打不开

站点从 HTTP 升级到 HTTPS 后,页面上的图片突然变成破图,控制台一堆“Mixed Content”报错——这是织梦 https 改造里最高频的故障。根因是图片 URL 还停留在 http:// 开头,浏览器在 https 页面里拒绝加载 http 资源。本文给出完整排查和修复方案。

一、问题根因分析

织梦图片地址来自三个层面,每一层都可能残留 http:

  1. 数据库存储 —— dede_archives.litpicdede_addonarticle.body 等字段里存的是绝对路径 http://www.xxx.com/uploads/...
  2. 系统参数 —— 后台“站点根网址”配的还是 http://
  3. 模板硬编码 —— 模板里 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://%';
替换前务必备份数据库。REPLACE 函数会修改所有匹配行,操作不可逆。替换后检查几条数据确认无误。

四、第三步:检查模板硬编码

模板里常见的 http 残留位置:

  • head.htm —— logo 图片、favicon
  • footer.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 链接:

  1. 后台 → 生成 → 更新主页 HTML
  2. 后台 → 生成 → 更新栏目 HTML(全选)
  3. 后台 → 生成 → 更新文档 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,避免反复返工。