nginx正規表示式

2021-07-29 17:25:06 字數 4100 閱讀 8236

1、nginx配置基礎

1、正規表示式匹配

~ 區分大小寫匹配

~* 不區分大小寫匹配

!~和!~*分別為區分大小寫不匹配及不區分大小寫不匹配

^ 以什麼開頭的匹配

$ 以什麼結尾的匹配

轉義字元。可以轉. * ?等

* 代表任意字元

2、檔案及目錄匹配

-f和!-f用來判斷是否存在檔案

-d和!-d用來判斷是否存在目錄

-e和!-e用來判斷是否存在檔案或目錄

-x和!-x用來判斷檔案是否可執行

例:location = /

#匹配任何查詢,因為所有請求都已 / 開頭。但是正規表示式規則和長的塊規則將被優先和查詢匹配

使用符號~*和~模式匹配的正規表示式:

1.~為區分大小寫的匹配。

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

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

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

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

location

檢視維基:location

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

**如下

複製**

location ~ .*.php?$

幾乎每個基於lemp的主機都會有如上一段**。他的匹配規則類似於if指令,不過他多了三個識別符號,^~、=、@。並

且它沒有取反運算子!,這三個識別符號的作用分別是:

1.^~ 識別符號後面跟乙個字串。nginx將在這個字串匹配後停止進行正規表示式的匹配(location指令中正則表達

式的匹配的結果優先使用),如:location ^~ /images/,你希望對/images/這個目錄進行一些特別的操作,如增加

expires頭,防盜煉等,但是你又想把除了這個目錄的外的所有只進行增加expires頭的操作,這個操作可能

會用到另外乙個location,例如:location ~* .(gif|jpg|jpeg)$,這樣,如果有請求/images/1.jpg,nginx如何決

定去進行哪個location中的操作呢?結果取決於識別符號^~,如果你這樣寫:location /images/,這樣nginx會將1.jpg

匹配到location ~* .(gif|jpg|jpeg)$這個location中,這並不是你需要的結果,而增加了^~這個識別符號後,它在匹

location,而不會匹配這個,當然可以寫兩個location,location = /和location /,這樣/index.html將匹配到後者

,如果你的站點對/的請求量較大,可以使用這個方法來加快請求的響應速度。

3.@ 表示為乙個location進行命名,即自定義乙個location,這個location不能被外界所訪問,只能用於nginx產生的

子請求,主要為error_page和try_files。

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

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

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

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

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

4.如果正規表示式能夠匹配到請求的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.(.*))

nginx中的正則如何匹配中文

首先確定在編譯pcre時加了enable-utf8引數,如果沒有,請重新編譯pcre,然後就可以在nginx的配置檔案中使用這

樣的正則:」(*utf8)^/[x-x]+)$」注意引號和前面的(*utf8),(*utf8)將告訴這個正則切換為utf8模

式。**如下

複製**

[root@backup conf]# pcretest

pcre version 8.10 2010-06-25

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

data> 測試

0: xx

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

no match

data> 參考手冊中文版

0: ******x

看下面的例子片斷(server段、wordpress安裝到多個目錄):

***********************************==

**如下

複製**

location /

location /user1/

location ~* ^/(user2|user3)/

location ~ .php$

原因在**?看到他們地區別了嗎?

/user1/是普通location寫法

而/user2/ 或 /user3/ 是正規表示式匹配的location

問題就出在了/user2/ 或 /user3/匹配location指令使用了正規表示式,所以必須注意**段的先後順序,必須把

location ~ .php$ 段上移、放到它的前面去。

正確的**舉例:

***********************************==

**如下

複製**

location /

location /user1/

location ~ .php$

location ~* ^/(user2|user3)/

【注意】對於普通location指令行,是沒有任何順序的要求的。如果你也遇到了類似的問題,可以嘗試調整使用正則

表示式的location指令片斷的順序來除錯

正規表示式 正規表示式 總結

非負整數 d 正整數 0 9 1 9 0 9 非正整數 d 0 負整數 0 9 1 9 0 9 整數 d 非負浮點數 d d 正浮點數 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 非正浮點數 d d 0 0 負浮點數 正浮點數正則式 英文本串 a za z...

正規表示式 表示式

網域名稱 a za z0 9 a za z0 9 a za z0 9 a za z0 9 interneturl a za z s 或 http w w w 手機號碼 13 0 9 14 5 7 15 0 1 2 3 5 6 7 8 9 18 0 1 2 3 5 6 7 8 9 d 號碼 x x x...

Nginx中的正規表示式

1 if指令 所有的nginx 內建變數都可以通過if指令和正規表示式來進行匹配,並且根據匹配結果進行一些操作,如下 if http cookie id 使用符號 和 模式匹配的正規表示式 為區分大小寫的匹配。不區分大小寫的匹配 匹配firefox的正則同時匹配firefox 和 意為 不匹配的 n...