以前寫過nginx反代替換的教程(傳送門),使用了ngx_http_substitutions_filter_module模塊。不過這貨只能替換同一行,具備侷限性-_-# 如今一個更強大的替換模塊來了……replace-filter-nginx-module 下面只翻譯一下,再加個安裝教程,由於我本身也沒弄懂怎樣玩= = 1.安裝此模塊須要先安裝sregex運行庫 apt-get update;
apt-get install git make gcc -y
#Centos改爲yum git clone https://github.com/agentzh/sregex cd sregex make make install cd .. git clone https://github.com/agentzh/replace-filter-nginx-module wget http://nginx.org/download/nginx-1.2.6.tar.gz tar zxvf nginx-1.2.6.tar.gz cd nginx-1.2.6 ./configure --add-module=../replace-filter-nginx-module #自行加其餘編譯參數 make make install nginx.conf的用法舉例: 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; } Syntax語法: ^ 匹配起始行數 $ 匹配末尾行數 \A match only at beginning of stream \z match only at end of stream \b match a word boundary \B match except at a word boundary . match any char \C match a single C-language char (octet) [ab0-9] character classes (positive) [^ab0-9] character classes (negative) \d match a digit character ([0-9]) \D match a non-digit character ([^0-9]) \s match a whitespace character ([ \f\n\r\t]) \S match a non-whitespace character ([^ \f\n\r\t]) \h match a horizontal whitespace character \H match a character that isn't horizontal whitespace \v match a vertical whitespace character \V match a character that isn't vertical whitespace \w match a "word" character ([A-Za-z0-9_]) \W match a non-"word" character ([^A-Za-z0-9_]) \cK control char (example: VT) \N match a character that isn't a newline ab concatenation; first match a, and then b a|b alternation; match a or b (a) capturing parentheses (?:a) non-capturing parantheses a? match 1 or 0 times, greedily a* match 0 or more times, greedily a+ match 1 or more times, greedily a?? match 1 or 0 times, not greedily a*? match 0 or more times, not greedily a+? match 1 or more times, not greedily a{n} match exactly n times a{n,m} match at least n but not more than m times, greedily a{n,} match at least n times, greedily a{n}? match exactly n times, not greedily (redundant) a{n,m}? match at least n but not more than m times, not greedily a{n,}? match at least n times, not greedily 做者信息: Yichun 「agentzh」 Zhang (章亦春) agentzh@gmail.com
The following Perl 5 regex syntax features have already been implemented.css
^ match the beginning of lines $ match the end of lines \A match only at beginning of stream \z match only at end of stream \b match a word boundary \B match except at a word boundary . match any char \C match a single C-language char (octet) [ab0-9] character classes (positive) [^ab0-9] character classes (negative) \d match a digit character ([0-9]) \D match a non-digit character ([^0-9]) \s match a whitespace character ([ \f\n\r\t]) \S match a non-whitespace character ([^ \f\n\r\t]) \h match a horizontal whitespace character \H match a character that isn't horizontal whitespace \v match a vertical whitespace character \V match a character that isn't vertical whitespace \w match a "word" character ([A-Za-z0-9_]) \W match a non-"word" character ([^A-Za-z0-9_]) \cK control char (example: VT) \N match a character that isn't a newline ab concatenation; first match a, and then b a|b alternation; match a or b (a) capturing parentheses (?:a) non-capturing parantheses a? match 1 or 0 times, greedily a* match 0 or more times, greedily a+ match 1 or more times, greedily a?? match 1 or 0 times, not greedily a*? match 0 or more times, not greedily a+? match 1 or more times, not greedily a{n} match exactly n times a{n,m} match at least n but not more than m times, greedily a{n,} match at least n times, greedily a{n}? match exactly n times, not greedily (redundant) a{n,m}? match at least n but not more than m times, not greedily a{n,}? match at least n times, not greedily
The following escaping sequences are supported:html
\t tab \n newline \r return \f form feed \a alarm \e escape \b backspace (in character class only) \x{}, \x00 character whose ordinal is the given hexadecimal number \o{}, \000 character whose ordinal is the given octal number
Escaping a regex meta character yields the literal character itself, like \{
and \.
.nginx
Only the octet mode is supported; no multi-byte character encoding love (yet).git
make make install
Gnu make and gcc are required. (On operating systems like FreeBSD and Solaris, you should typegmake
instead of make
here.)github
It will build libsregex.so
(or libsregex.dylib
on Mac OS X), libsregex.a
, and the command-line utility sregex-cli
and install them into the prefix /usr/local/
by default.api
If you want to install into a custom location, then just specify the PREFIX
variable like this:less
make PREFIX=/opt/sregex make install PREFIX=/opt/sregex
If you are building a binary package (like an RPM package), then you will find the DESTDIR
variable handy, as inui
make PREFIX=/opt/sregex make install PREFIX=/opt/sregex DESTDIR=/path/to/my/build/root
If you run make distclean
before make
, then you also need bison 2.7+ for generating the regex parser files.this
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; }