程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP基礎知識 >> nginx重寫規則中某些特定正則表達式不生效的處理

nginx重寫規則中某些特定正則表達式不生效的處理

編輯:PHP基礎知識
 

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+)這樣的重寫規則生效。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved