nginx正則有些特殊的使用方法,在我們一台老舊的centos測試平台上不正常。比如
([0-9]+)-([0-9]+)可以正常使用,但是換成(\d+)-(\d+)卻不能使用。
一些特殊的nginx裡面使用的正則表達式
. 換行符以外的所有字符
\w 匹配字母或數字或下劃線或漢字
\s 匹配任意的空白符
\d 匹配數字
\b 匹配單詞的開始或結束
^ 匹配字符串的開始
$ 匹配字符串的結束
* 重復零次或更多次
+ 重復一次或更多次
? 重復零次或一次
{n} 重復n次
{n,} 重復n次或更多次
{n,m} 重復n到m次
使用pcretest測試,是能支持上面的正則匹配的。但是nginx就是沒生效。
# pcretest
PCRE version 6.6 06-Feb-2006
re> /(\d+)-(\d+)/
data> 123-456
0: 123-456
1: 123
2: 456
data> 1-2
0: 1-2
1: 1
2: 2
data> 23-45
0: 23-45
1: 23
2: 45
繼續debug:
# ldd /opt/nginx/sbin/nginx
linux-gate.so.1 => (0x0076c000)
libpthread.so.0 => /lib/libpthread.so.0 (0×00594000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x001b9000)
libpcre.so.0 => /usr/local/lib/libpcre.so.0 (0x00bcb000)
libcrypto.so.6 => /lib/libcrypto.so.6 (0×02704000)
libz.so.1 => /usr/lib/libz.so.1 (0x005ad000)
libc.so.6 => /lib/libc.so.6 (0x0041f000)
/lib/ld-linux.so.2 (0x0081c000)
libdl.so.2 => /lib/libdl.so.2 (0x0058e000)
發現使用的/usr/local/lib/libpcre.so.0
不屬於任何包,這個庫應該是有問題的,可能是手工編譯來的或者是系統自帶,沒有去查來歷。
# rpm -qf /usr/local/lib/libpcre.so.0.0.1
file /usr/local/lib/libpcre.so.0.0.1 is not owned by any package
查詢當前最新的正則庫位置
# rpm -ql pcre-6.6-6.el5_6.1
/lib/libpcre.so.0
/lib/libpcre.so.0.0.1
/usr/bin/pcregrep
/usr/bin/pcretest
/usr/lib/libpcrecpp.so.0
/usr/lib/libpcrecpp.so.0.0.0
/usr/lib/libpcreposix.so.0
/usr/lib/libpcreposix.so.0.0.0
/usr/share/doc/pcre-6.6
/usr/share/doc/pcre-6.6/AUTHORS
/usr/share/doc/pcre-6.6/LICENCE
/usr/share/man/man1/pcregrep.1.gz
/usr/share/man/man1/pcretest.1.gz
替換系統的正則庫
# mv /usr/local/lib/libpcre.so.0.0.1 /usr/local/lib/libpcre.so.0.0.1.bak
[root@test nginx-1.3.7]# ln -s /lib/libpcre.so.0.0.1 /usr/local/lib/
最後測試(\d+)-(\d+)這樣的重寫規則生效。