最近在做一个网站的改版和调整,主要是网页修改、图片替换等工作。
开发环境:
Apache、PHP
线上环境:
Nginx、PHP、CDN
网站页面展示是混合型展示,有的是php输出页面,有的是直接展示html页面,所有图片资源都是放在cdn上面。
改动涉及两种:
1. 当网页内容改动时,主要是修改源代码(php或html),然后将代码提交,上线发布。
2. 当图片内容改动时,需要上传新的图片到cdn,图片名字禁止重用,修改源代码中图片的名字,然后将代码提交,上线发布。
比较复杂的是第二种,这里举个例子,网站首页图片需要替换,原来首页图片名字是hello.jpg。
1. 将新图命名为hello2.jpg。
2. 将新图上传到cdn代码库。
3. 将cdn进行更新。
4. 修改本地代码,将hello.jpg换成hello2.jpg。
5. 确认开发环境网页效果是否满足需求。
这个流程比较复杂,开发环境很低效,因为只要修改一次图片,我们就要向cdn上传一次,会很慢,不方便快速调试。想到了一个解决方案,就是开发环境和线上环境静态资源分开,开发环境访问的图片路径指向开发环境地址,线上的图片路径指向cdn。但是这个解决方案有个问题,php输出的内容很好改,用php进行if逻辑判断即可,而html代码不是很好改,html代码中图片都是放在src里面,总不能再写个js进行控制吧。
再深入想一下需要解决什么问题,无非就是希望相同的代码,开发环境返回给浏览器的是:
http://img.dev.com/hello2.jpg
线上环境返回给浏览器的是:
http://img.online.com/hello2.jpg
那么,我们能不能让服务器来解决呢?毕竟所有网页请求都是服务器返回的,如果服务器在返回数据时进行替换,岂不是更安全,更方便。
这就有了今天要介绍的Apache Module mod_substitute!
模块mod_substitute的官网解释:
Perform search and replace operations on response bodies.
对请求的返回内容进行搜索和替换。
需要让apache支持该模块,默认此模块未被打开,修改apache/conf/httpd.conf文件。
打开substitute_module模块,同时还要打开filter_module,否则在使用时会报错Invalid command 'AddOutputFilterByType', perhaps misspelled or defined by a module not included in the server configuration。
LoadModule filter_module modules/mod_filter.so
在httpd.conf修改配置处,添加如下代码,这个代码含义是修改所有请求,将字符串foo替换成bar,且搜索不区分大小写。
AddOutputFilterByType SUBSTITUTE text/html
Substitute "s/foo/bar/ni"
</Location>
重启apache。
新建两个文件,test.php和test.html,文件内容均为:
浏览器分别访问test.php和test.html,会得到相同内容,均为:
Hello world.
This is bar!
This is bar!
This is bar!
注意不要有其它过滤类型,比如AddOutputFilterByType DEFLATE,否则会出现诡异问题。html代码length短的时候可被替换,长的时候却不能生效。
官网还给了其它的一些替换规则,比如支持正则替换,需要去掉n参数。
AddOutputFilterByType SUBSTITUTE text/html
Substitute "s|<BR */?>|<br />|i"
</Location>
<Location "/">
AddOutputFilterByType SUBSTITUTE text/html
# "foo=k,bar=k" -> "foo/bar=k"
Substitute "s|foo=(\w+),bar=\1|foo/bar=$1"
</Location>
参数的意义:
i——忽略大小写
n——不使用正则
Leave a Reply