nginx正则与pcretest

2013年4月24日 发表评论 阅读评论

能配置nginx的正则是运维的一项基本要求,同其他很多应用一样,linux下的正则都是依赖pcre进行的。而pcre安装包里也提供了一相应的工具用于测试正则是否正确,该工具就是pcretest 。

平时在nginx书写正则规则时,常用到的一些正则符号如下表:

nginx-pcretest

而最近在对一台老版本的centos 测试主机上的nginx书写正则规则时,发现([0-9]+)-([0-9]+)可以正常使用,但是换成(d+)-(d+)却不能使用(神奇了,在另一台却是好的) 。为了定位问题,首先对rewrite语句进行pcretest测试,发现规则没有问题,但是nginx就是没生效。

pcretest的用法如下:

# 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

输入完命令后,在re>后输入要测试的正则表达式,在data>后输入要被处理的文本,回车后显示的就是$0,$1,$2等各部分显示的值 。

通过pcretest测试完后,发现rewrite没有问题,再通过ldd工具,查看下nginx调用到的lib库文件:

# 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)

正则有问题,重点看libpcre库了 。发现使用的/usr/local/lib/libpcre.so.0 ,不属于任何包,这个库从路径上盾应该是手工编译的。不过为了进一步确定是否为rpm包安装,还可以用rpm命令进行进一步的检测:

# 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安装时用到的pcre包的路径:

# 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

所以,该问题,应该是nginx调用到的pcre lib文件被别人给清掉或删掉了。所以解决该问题就非常简单了,要么将系统rpm安装的软链接到相应的路径,要么重新安装pcre到/usr/lib/local。

[root@test ]# ln -s /lib/libpcre.so.0.0.1 /usr/local/lib/

重新安装后,也可以到pcre安装后的bin目录查看,同时会有pcretest会成生。

[root@back bin]# ls
pcre-config  pcregrep  pcretest
[root@back bin]# pwd
/usr/local/pcre/bin
[root@back bin]# 




本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

分类: http/html/web 标签: ,
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.