漫画 Nginx 的 subfilter
大周五的,马上就要下班了,接到一个需求,一个老网站,需要加 SSL 证书,改成全站 HTTPS,没多想,不就是加个证书么
certbot 脚本一跑,证书自动配好
certbot 自动添加证书,并自动配置强制跳转到 HTTPS,访问测试
网站样式全乱,打开开发者工具
原来是资源都是 http 的,被浏览器 blocked,无法加载,查看代码,发现资源都是直接写死 http 协议的,内容很多,前端文件还都是压缩过的,这要手动改肯定是不可能的
突然想到 Nginx 的 subfilter 模块,subfilter 可以查询并修改 response 内容,所以可以将响应内容中的 http 替换为 https
nginx 的 sub 模块很简单,就 4 个指令,分别是
sub_filter
sub_filter_last_modified
sub_filter_once
sub_filter_types
sub_filter,就是替换指令,有两个参数,第一个是原字符串,第二个是目标字符串
sub_filter_last_modified 指令,是允许再替换期间,保留原始响应头中的 Last-Modified 字段,用来响应缓存,默认情况下是关闭的,就是在修改响应内容的时候,会删除标头字段
sub_flter_once 指令,是指定替换一次还是替换所有匹配到的字符串,默认是 on,替换第一次匹配到的,注意是第一次,不是第一个
sub_filter_types 指令,是可以根据 MIME 类型来指定替换指定类型的文件内容,而不是替换所有
通过这样的方式所有内容就会都变成 https 的请求,Nginx 配置很简单
subfilter 类型是文档类型,替换是将 http://替换为 https://,然后配置只替换一次,否则会一直处理替换操作
这要再次访问网站的时候,就可以正常访问,除了这种方式,其实在 linux 下,也可以通过 sed 命令遍历完全替换目录下所有文件中的 http,但是还是推荐用 Nginx 模块的方式,可以不去改动代码
版权声明: 本文为 InfoQ 作者【运维研习社】的原创文章。
原文链接:【http://xie.infoq.cn/article/d19e91bbcc7905afbb74b3b0f】。文章转载请联系作者。
评论