证书装好、小锁出来,不等于页面全安全。有些站首页正常,点进内页地址栏就变成“不安全”,或者小锁旁边挂个感叹号。按F12打开Console,通常能看到一串Mixed Content开头的红字,后面跟着被拦下的地址。这类问题跟证书本身没关系,是HTTPS页面里去加载了http资源,浏览器认为页面被掺进了不安全的成分。证书链不全、证书过期、域名不匹配也会报警,但那是整站级的,所有页面一起红;混合内容挑页面,往往只有几个内页出问题,首页看着一切正常,很容易被当成偶发故障放过去。
图片、音视频这类被动内容,浏览器会先把请求降级放行,但地址栏照样标不安全;脚本、样式表、iframe、XHR这类主动内容会被直接拦掉,表现是页面样式错乱、按钮点了没反应、地图加载不出来。
Console面板里搜Mixed Content,每条报错都写着是哪个文件发起的请求、请求的完整地址。同一类报错会重复几十条,先按文件归并,出现次数最多的那个文件就是主犯。Network面板按Protocol列排序,剩下http/1.1的就是没升级的请求,点开看Initiator能追到是模板还是插件发起的。报错经常只出现在某个页面,比如商品详情页引了第三方统计脚本、首页却干净,这类得把主要模板逐个打开看。
来源集中在三处:主题模板里写死的http地址、老插件引用的外部CDN、数据库正文里存成绝对路径的图片。
最省事的做法是加一行CSP,在nginx里回一个Content-Security-Policy头,值写upgrade-insecure-requests,浏览器会自动把页面里的http请求抬成https再发。这一行能解决大部分被动内容,但它同时也抬高所有请求,遇到只有http的第三方接口,对方会被打成请求失败,上线前得先在测试环境跑一遍。另一个备选是nginx的sub_filter模块,在返回HTML时把http://替换成https://,只对text/html生效,改动在服务端,不用碰数据库。代价是每次响应多一层字符串处理,页面大、并发高的站要留意开销。
根上的活是改数据。批量替换前先备份,把带http://的旧地址换成https://。WordPress这类程序注意别直接在数据库里对序列化字段做替换,长度对不上会把整条记录弄坏,用官方命令行工具或者插件改更稳,改完还要把固定链接重新保存一次。
还有一种容易被漏掉:站点前面挂了CDN或反向代理,程序判断不出自己走的是HTTPS,后台一直往http跳。这时候要在配置里把X-Forwarded-Proto这个头带过去,让程序认到真实协议。改完清缓存、硬刷新,再看Console是否干净。别只验首页,带表单、带评论、带支付的页面都过一遍,混合内容最容易藏在那些页面里。
A5创业网 版权所有