nginx重写规则中某些特定正则表达式不生效的处理
nginx正则有些特殊的使用方法,在我们一台老旧的centos5测试平台上不正常。比如
([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+)这样的重写规则生效。