Bootstrap

漫画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模块的方式,可以不去改动代码