我们专注服务于当下互联网基础设施建设与云计算、大数据时代的各种需求!

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

[[email protected] nginx-1.3.7]# ln -s /lib/libpcre.so.0.0.1 /usr/local/lib/

最后测试(\d+)-(\d+)这样的重写规则生效。