Nginx中的正規表示式

2021-06-22 14:39:02 字數 3454 閱讀 2452

1、if指令

所有的nginx

內建變數都可以通過if指令和正規表示式來進行匹配,並且根據匹配結果進行一些操作,如下:

if ($http_cookie ~* "id=([^;] +)(?:;|$)" )使用符號~*和~模式匹配的正規表示式:

~為區分大小寫的匹配。

~*不區分大小寫的匹配(匹配firefox的正則同時匹配firefox)。

!~和!~*意為「不匹配的」。

nginx在很多模組中都有內建的變數,常用的內建變數在http核心模組中,這些變數都可以使用正規表示式進行匹配。

2、可以通過正規表示式匹配的指令

location

檢視維基:location

可能這個指令是我們平時使用正則匹配用的最多的指令:

location ~ .*\.php?$
幾乎每個基於lemp的主機都會有如上一段**。他的匹配規則類似於if指令,不過他多了三個識別符號,^~、=、@。並且它沒有取反運算子!,這三個識別符號的作用分別是:

= 表示精確的查詢位址,如location = /它只會匹配uri為/的請求,如果請求為/index.html,將查詢另外的location,而不會匹配這個,當然可以寫兩個 location,location = /和location /,這樣/index.html將匹配到後者,如果你的站點對/的請求量較大,可以使用這個方法來加快請求的響應速度。

@ 表示為乙個location進行命名,即自定義乙個location,這個location不能被外界所訪問,只能用於nginx產生的子請求,主要為error_page和try_files。

注意,這3個識別符號後面不能跟正規表示式,雖然配置檔案檢查會通過,而且沒有任何警告,但是他們並不會進行匹配。

綜上所述,location指令對於後面值的匹配順序為:

識別符號「=」的location會最先進行匹配,如果請求uri匹配這個location,將對請求使用這個location的配置。

進行字串匹配,如果匹配到的location有^~這個識別符號,匹配停止返回這個location的配置。

按照配置檔案中定義的順序進行正規表示式匹配。最早匹配的location將返回裡面的配置。

如果正規表示式能夠匹配到請求的uri,將使用這個正則對應的location,如果沒有,則使用第二條匹配的結果。

server_name

檢視維基:server_name

server_name用於配置基於網域名稱或ip的虛擬主機,這個指令也是可以使用正規表示式的,但是注意,這個指令中的正規表示式不用帶任何的識別符號,但是必須以~開頭:

server
server_name指令中的正規表示式可以使用引用,高階的應用可以檢視這篇文章:在server_name中使用正規表示式

fastcgi_split_path_info

檢視維基:fastcgi_split_path_info

這個指令按照cgi標準來設定script_filename (script_name)和path_info變數,它是乙個被分割成兩部分(兩個引用)的正規表示式。如下:

location ~ ^.+\.php
第乙個引用(.+\.php)加上/path/to/php將作為script_filename,第二個引用(.*)為path_info,例如請求的完整uri為show.php/article/0001,則上例中script_filename的值為/path/to/php /show.php,path_info則為/article/0001。

這個指令通常用於一些通過path_info美化uri的框架(例如codeigniter)。

gzip_disable

檢視維基:gzip_disable

通過正規表示式來指定在哪些瀏覽器中禁用gzip壓縮。

gzip_disable     "msie6";
rewrite

檢視維基:rewrite

這個指令應該也是用的比較多的,它需要使用完整的包含引用的正規表示式:

rewrite  "/photos/([0-9] )([0-9] )([0-9] )" /path/to/photos/$1/$1$2/$1$2$3.png;
通常環境下我們會把它和if結合來使用:

if ($host ~* www\.(.*))
需要注意的是rewrite後面的第乙個正則引數永遠是只對uri進行匹配,而不是對完整的帶主機頭的url,如上例中,if語句來判斷主機頭,如果匹配 www\.(.*),則設定乙個變數$host_without_www的值為www\.(.*)的引用,如果上例中的請求url為www.mydomain.com/foo,則$host_without_www的值為mydomain.com,而下面的rewrite指令中,第乙個正規表示式的引用將為/foo,則最終通過這個重寫後的請求url為

3、nginx中的正則如何匹配中文

首先確定在編譯pcre時加了enable-utf8引數,如果沒有,請重新編譯pcre,然後就可以在nginx的配置檔案中使用這樣的正則:」 (*utf8)^/[\x-\x]+)$」注意引號和前面的(*utf8),(*utf8)將告訴這個正則切換為utf8模式。

4、如何測試你的正規表示式

通常我們在nginx安裝之前會編譯安裝pcre,它自帶乙個小工具:pcretest,使用方法以下:

[root@backup conf]# pcretest

pcre version 8.10 2010-06-25

re> /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))$/ ###這是乙個匹配ip的正則

data> 192.168.10.1

0: 192.168.10.1

1: 192

2: .1

3: 1

data> 666.666.666.666

no match

data> 255.255.255.255

0: 255.255.255.255

1: 255

2: .255

3: 255

data> 0.0.0.0

0: 0.0.0.0

1: 0

2: .0

3: 0

data> 666777

no match

匹配中文:

[root@backup conf]# pcretest

pcre version 8.10 2010-06-25

re> /^[\x-\x]+/8

data> 測試

0: \x\x

data> nginx模組參考手冊中文版

no match

data> 參考手冊中文版

0: \x\x\x\x\x\x\x

注意正規表示式後面的8,它表示這條正則使用utf-8匹配。

nginx正規表示式

1 nginx配置基礎 1 正規表示式匹配 區分大小寫匹配 不區分大小寫匹配 和 分別為區分大小寫不匹配及不區分大小寫不匹配 以什麼開頭的匹配 以什麼結尾的匹配 轉義字元。可以轉.等 代表任意字元 2 檔案及目錄匹配 f和 f用來判斷是否存在檔案 d和 d用來判斷是否存在目錄 e和 e用來判斷是否存...

Nginx的Location正規表示式

location的作用 location的語法 已 開頭表示精確匹配 如 a 中只匹配根目錄結尾的請求,後面不能帶任何字串。開頭表示uri以某個常規字串開頭,不是正則匹配 開頭表示區分大小寫的正則匹配 開頭表示不區分大小寫的正則匹配 通用匹配,如果沒有其它匹配,任何請求都會匹配到 server 以開...

sql正規表示式 SQL中的正規表示式

sql正規表示式 sql中的正規表示式 sql的查詢語句中,有時會需要引進正規表示式為其複雜搜尋指定模式。下面給出一些 regexp 在mysql 語句中應用 非全部 1 匹配字串的開始部分。mysql select fo nfo regexp fo 0mysql select fofo regex...