原文: openresty/replace-filter-nginx-module

1. 概要

location /t {
default_type text/html;
echo abc;
replace_filter 'ab|abc' X;
} location / {
# proxy_pass/fastcgi_pass/... # caseless global substitution:
replace_filter '\d+' 'blah blah' 'ig';
replace_filter_types text/plain text/css;
} location /a {
# proxy_pass/fastcgi_pass/root/... # remove line-leading spaces and line-trailing spaces,
# as well as blank lines:
replace_filter '^\s+|\s+$' '' g;
} location /b {
# proxy_pass/fastcgi_pass/root/... # only remove line-leading spaces and line-trailing spaces:
replace_filter '^[ \f\t]+|[ \f\t]+$' '' g;
} location ~ '\.cpp$' {
# proxy_pass/fastcgi_pass/root/... replace_filter_types text/plain; # skip C/C++ string literals:
replace_filter "'(?:\\\\[^\n]|[^'\n])*'" $& g;
replace_filter '"(?:\\\\[^\n]|[^"\n])*"' $& g; # remove all those ugly C/C++ comments:
replace_filter '/\*.*?\*/|//[^\n]*' '' g;
}

2. 描述

该 Nginx 输出过滤模块尝试尽可能以非缓存模式执行正则表达式替换。

该模块没有使用像 PCRE 这样的传统回溯正则表达式 engines,而是使用由作者实现的新的 sregex 库,它从一开始就考虑了流处理。

sregex 支持 Perl 5 正则表达式的一个很好的公共子集。关于完整的功能列表,可查看 sregex 的文档: sregex Syntax Supported.

响应体数据仅在绝对必要时才进行缓存,例如面对属于数据块边界附近可能匹配的不完整捕获。

3. 指令

3.1 replace_filter

syntax: replace_filter <regex> <replace>

syntax: replace_filter <regex> <replace> <options>

defaultL no

context: http, server, location, location if

phase: output body filter

通过可选地正则标志指定正则模式和要被替换为的文本。

By default, the filter topped matching after the first match is found. This behavior can be changed by specifying the g regex option.

支持如下正则选项:

  • g:全局搜索和替换(默认关闭该功能)
  • i:不区分大小写(默认关闭)

在一个单独的字符串参数中可以联合多个选项,如下:

replace_filter hello hiya ig;

Nginx 变量可以插入到要替换的文本中,如下:

replace_filter \w+ "[$foo,$bar]";

如果要使用 '$' 字符,则使用 '$$',例如:

replace_filter \w "$$";

支持使用子匹配捕获变量,如 $&, $1, $2 等等,如下示例:

replace_filter [bc]|d [$&-$1-$2] g;

子匹配捕获变量的语义与 Perl 5 语言完全相同。

在同一范围下支持多个 replace_filter 指令,所有的 pattern 将在 tokenizer 中同时应用。不会使用最长的 token 匹配语义,而是根据配置文件中的顺序对 pattern 进行优先级排序。

如下示例是从 C/C++ 源文件中删除所有的 C/C++ 注释:

replace_filter "'(?:\\\\[^\n]|[^'\n])*'" $& g;
replace_filter '"(?:\\\\[^\n]|[^"\n])*"' $& g;
replace_filter '/\*.*?\*/|//[^\n]*' '' g;

Content-Encoding 响应头部不为空(类似 gzip)时,响应主体将始终保持不变。因此,如果是 ngx_proxy 模块的话,通常需要在 nginx.conf 中添加如下行,以在后端服务器响应中禁用 gzip 压缩:

proxy_set_header Accept-Encoding '';

响应仍然可以在 Nginx 服务器级别上进行 gzip 压缩。

3.2 replace_filter_types

syntax: replace_filter_types <mime-type> ...

default: replace_filter_types text/html

context: http, server, location, location if

phase: output body filter

指定要被处理的一个或多个 MIME 类型(在 Content-Type 响应头部中)。

默认情况下,仅处理 text/html 类型的响应。

3.3 replace_filter_max_buffered_size

syntax: replace_filter_max_buffered_size <size>

default: replace_filter_max_buffered_size 8k

context: http, server, location, location if

phase: output body filter

限制模块在运行时缓冲的数据的总大小,默认为 8k。

当达到限制值时,replace_filter 将立即停止处理,并保留所有剩余的响应正文数据。

3.4 replace_filter_last_modified

syntax: replace_filter_last_modified keep | clear

default: replace_filter_last_modified clear

context: http, server, location, location if

phase: output body filter

控制如何去处理现有的 Last-Modified 响应头。

默认情况下,该模块将清除 Last-Modified 响应头(如果有)。可以通过指定如下行来保留原始的 Last-Modified 响应头:

replace_filter_last_modified keep;

3.5 replace_filter_skip

syntax: replace_filter_skip $var

default: no

context: http, server, location, location if

phase: output header filter

该指令控制是否基于每个请求跳过所有的 replace_filter 规则。

该指令支持常量值或者包含 Nginx 变量的字符串。

当在请求输出 header 阶段将值评估为空值("")或者值 "0" 时,将不会跳过当前请求的 replace_filter 规则。否则,将会跳过当前请求的所有 replace_filter 规则。

如下一个简单的示例:

set $skip '';
location /t {
content_by_lua '
ngx.var.skip = 1
ngx.say("abcabd")
';
replace_filter_skip $skip;
replace_filter abcabd X;
}

4. 安装

首先安装 sregex 库: https://github.com/agentzh/sregex

然后重新编译 Nginx:

./configure --add-module=/path/to/replace-filter-nginx-module

如果 sregex 不是安装在默认前缀路径下(如 /usr/local),则可以在执行 ./configure 脚本前,通过 SREGEX_INCSREGEX_LIB 环境变量来指定 sregex 的安装位置。

export SREGEX_INC=/opt/sregex/include
export SREGEX_LIB=/opt/sregex/lib

从 Nginx 1.9.11 版本以上,可以在 ./configure 命令行上通过使用 --add-dynamic-module=PATH 选项来代替 --add-module=PATH ,从而将该模块编译为动态模块,然后在 ngxin.conf 上通过 load_module 指令显示加载该模块。

load_module /path/to/modules/ngx_http_replace_filter_module.so;

OpenResty之replace-filter-nginx-module的更多相关文章

  1. Emiller's Advanced Topics In Nginx Module Development

    Emiller的Nginx模块开发指南 By Evan Miller DRAFT: August 13, 2009 (changes) 翻译:Kongch @2010年1月5日 0:04am -- 2 ...

  2. 实战开发一个Nginx扩展 (Nginx Module)

    repo地址 https://github.com/wujunze/nginx-http-echo-module nginx_module_echo 使用echo指令输出一个字符串 Nginx 版本 ...

  3. 用lua nginx module搭建一个二维码

    用lua nginx module搭建一个二维码(qr code)生成器 作者 vinoca 發布於 2014年10月31日 如果有VPS,或者开源的路由器,安装一个nginx,添加lua-nginx ...

  4. openresty如何完美替换nginx

    下载openresty wget https://openresty.org/download/openresty-1.15.8.1.tar.gz tar zxvf openresty-1.15.8. ...

  5. Filebeat Nginx Module 自定义字段

    Filebeat Nginx Module 自定义字段 一.修改/usr/local/nginx/conf/nginx.conf中 log_format access '$remote_addr - ...

  6. Nginx research, nginx module development

    catalog . 初探nginx架构 . handler模块 . Nginx编译.安装.配置 . Hello World模块开发 1. 初探nginx架构 nginx在启动后,在unix系统中会以d ...

  7. openresty HTTP status constants nginx api for lua

    https://github.com/openresty/lua-nginx-module context: init_by_lua, set_by_lua, rewrite_by_lua, acce ...

  8. openresty安装lua和nginx相关

    server{ listen ; server_name a.com; index index.php; root /usr/share/nginx/html; location / { if (!- ...

  9. FastDFS+Nginx+Module

    1.安装libevent wget  https://cloud.github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.g ...

  10. Nginx+lua+openresty精简系列

    1. CentOS系统安装openresty 你可以在你的 CentOS 系统中添加 openresty 仓库,这样就可以便于未来安装或更新我们的软件包(通过 yum update 命令).运行下面的 ...

随机推荐

  1. 高并发编程系列:ConcurrentHashMap的实现原理(JDK1.7和JDK1.8)

    HashMap.CurrentHashMap 的实现原理基本都是BAT面试必考内容,阿里P8架构师谈:深入探讨HashMap的底层结构.原理.扩容机制深入谈过hashmap的实现原理以及在JDK 1. ...

  2. iOS 数据源切换混乱问题

    问题场景 这个问题遇到是偶然的,正常来说是不会出现的.但是有时候在一些极端操作情况下,还是出现了. 现在我说明下这个场景.页面上是一个tableview,那对应的有一个dataSource,页面顶部有 ...

  3. Device doesn't support wireless sync. AMDeviceStartService

    Flutter1.9.1+hotfix2 Dart2.5 在iOS13真机上启动不了 错误信息 Device doesn't support wireless sync. AMDeviceStartS ...

  4. reinterpret

    reinterpret意为“重新解释” reinterpret_cast是C++中与C风格类型转换最接近的类型转换运算符.它让程序员能够将一种对象类型转换为另一种,不管它们是否相关. reinterp ...

  5. 【前端开发】】js中var写和不写的区别

    js中var用与不用的区别 Javascript声明变量的时候,虽然用var关键字声明和不用关键字声明,很多时候运行并没有问题,但是这两种方式还是有区别的.可以正常运行的代码并不代表是合适的代码. v ...

  6. Windows下无法新建文件夹

    原文链接:https://www.jianshu.com/p/ee3205d5b9c9

  7. SQL Server 2005的几个新功能

    SQL Server 2005相对于SQL Server 2000改进很大,有些还是非常实用的. 举几个例子来简单说明 这些例子我引用了Northwind库. 1. TOP 表达式  SQL Serv ...

  8. python数据类型:dict(字典)

    一.字典的简单介绍 字典(dict)是python中唯一的一个映射类型.他是以{}括起来的键值对组成. 语法: {key1:value1,key2:value2......} 注意:key必须是不可变 ...

  9. JS中map、some、every、filter方法

    简介 every()方法用于检测数组中所有元素是否都符合指定条件,若符合返回true,否则返回false:不会对空数组进行检测,不会改变原来的数组. some()方法用于检测数组中的元素是否有满足指定 ...

  10. selenium之python源码解读-WebDriverWait

    一.显示等待 所谓显示等待,是针对某一个特定的元素设置等待时间,如果在规定的时间内找到了该元素,就执行相关的操作,如果在规定的时间内没有找到该元素,在抛出异常 PS:注意显示等待和隐身等待的区别,隐身 ...