首页 > Apache/Nginx > openresty/nginx 中如何替换正文字符串

openresty/nginx 中如何替换正文字符串

最近搞了个海外的阿里云主机后,就把自己的个人站迁移了。然后就想办法做优化,用上了openresty + php7 + http2。
因为历史原因,自己搞了几个不同的域名,一个是fukun.org,还有一个之前一直用的digdeeply.org,现在想统一起来,可是却发现wordpress里有很多上传附件的时候,链接已经是写死的,使用的当时的域名digdeeply.org,如果去一个一个的把他们替换过来,就不太现实了。
因为自己用过openresty中的lua,所以首先想到的就是使用一个content_by_lua来实现替换,在这个阶段把内容中字符串替换掉,不过有个细节问题就是这里lua拿到的都是nginx的一个一个的chunk,如果想要替换的字符串正好在两个chunk的分界处,那么这个就会被漏掉而不能替换。
然后在查一些资料的时候,突然发现,其实,nginx自己就有支持字符串替换的模块的: sub_filter , 这样就不用自己在lua写了,会更方便一些,那么先来看看sub_filter怎么用吧。

location / {
    sub_filter 'https://fukun.org'  'https://fukun.org';
    sub_filter 'https://fukun.org'  'https://fukun.org';
    sub_filter_once off;
}

用法很简单,只要使用 sub_filter ‘search’ ‘replacement’ ,把被替换和替换内容给出来就可以了,可以写多条规则,替换多次。 其它的几个参数稍微看下文档也能明白了:

语法: sub_filter_once on | off;
默认值: sub_filter_once on;
配置段: http, server, location 字符串替换一次还是多次替换,默认替换一次。如果全文中有多个查找到的字符串,希望全部替换的话,就开启这个选项。

语法: sub_filter_types mime-type …;
默认值: sub_filter_types text/html;
配置段: http, server, location 指定需要被替换的MIME类型,默认为“text/html”,如果制定为*,那么所有类型的内容都会被替换,我们其实一般来说,只希望替换text/html中的就可以了,因为如果是图片啥的,你想替换啥呢?

如何安装sub_filter功能模块http_sub_module

以上是sub_filter的用法,但是如果你已经安装好nginx服务了,而且之前没有安装sub_filter模块,那怎么办呢,总不能把nginx全部重新编译重装吧,那样会覆盖之前的nginx配置,还得再来配置一遍。
可以用另外一种方法来更新nginx,那就是只从新编译,而不安装。就是只执行 ./configure 和 make 方法,而不执行make install,这样就不会有问题了。然后把make编译好的nginx二进制文件拷贝到已安装的nginx sbin目录下覆盖之前的,覆盖之前请做好备份,并停止当前运行的nginx。
我是用的openresty,所以很多configure的参数不用自己加,第一次我编译的时候,因为需要http2和status模块, 只执行了:

./configure --prefix=/home/s/apps/openresty-1.9.7.1 --with-http_v2_module --with-http_ssl_module --with-luajit --with-http_stub_status_module

现在需要sub_filter功能,所以只要添加–with-http_sub_module就可以了。那么就是这么编译:

./configure --prefix=/home/s/apps/openresty-1.9.7.1 --with-http_v2_module --with-http_ssl_module --with-luajit --with-http_stub_status_module --with-http_sub_module

然后把build/nginx-xxx/objs目录下的nginx二进制文件复制走去用就可以了。

  1. chenjia404 6月 10th, 2016 @ 03:38 | #1

    http_sub_module只能替换一次,这是一个问题。

  2. chenjia404 10月 19th, 2016 @ 14:28 | #2

    使用sub_filter_once off;就解决了一次替换问题。

评论提交中, 请稍候...

留言

可以使用的标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
Trackbacks & Pingbacks ( 0 )
  1. 还没有 trackbacks