1. 程式人生 > >nginx 正則表示式匹配入門篇

nginx 正則表示式匹配入門篇

1、nginx配置基礎

1、正則表示式匹配

~ 區分大小寫匹配

~* 不區分大小寫匹配

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

^ 以什麼開頭的匹配

$ 以什麼結尾的匹配

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

* 代表任意字元

2、檔案及目錄匹配

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

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

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

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

例:

location = /

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

location ^~ /images/ {

# 匹配任何已/images/開頭的任何查詢並且停止搜尋。任何正則表示式將不會被測試。

location ~* .(gif|jpg|jpeg)$ {

# 匹配任何已.gif、.jpg 或 .jpeg 結尾的請求

入門

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

 程式碼如下 複製程式碼
if ($http_user_agent ~ MSIE) {
  rewrite  ^(.*)$  /msie/$1  break;
}
 
if ($http_cookie ~* "id=([^;] +)(?:;|$)" ) {
  set  $id  $1;
}

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

1.~為區分大小寫的匹配。
2.~*不區分大小寫的匹配(匹配firefox的正則同時匹配FireFox)。
3.!~和!~*意為“不匹配的”。
Nginx在很多模組中都有內建的變數,常用的內建變數在HTTP核心模組中,這些變數都可以使用正則表示式進行匹配。

2、可以通過正則表示式匹配的指令
location
檢視維基:location
可能這個指令是我們平時使用正則匹配用的最多的指令:

 程式碼如下 複製程式碼

location ~ .*.php?$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /data/wwwsite/test.com/$fastcgi_script_name;
        include        fcgi.conf;
    }

幾乎每個基於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中,這並不是你需要的結果,而增加了^~這個識別符號後,它在匹

配了/images/這個字串後就停止搜尋其它帶正則的location。
2.= 表示精確的查詢地址,如location = /它只會匹配uri為/的請求,如果請求為/index.html,將查詢另外的

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

,如果你的站點對/的請求量較大,可以使用這個方法來加快請求的響應速度。
[email protected] 表示為一個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   www.example.com   ~^wwwd+.example.com$;
}

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

fastcgi_split_path_info
檢視維基:fastcgi_split_path_info
這個指令按照CGI標準來設定SCRIPT_FILENAME (SCRIPT_NAME)和PATH_INFO變數,它是一個被分割成兩部分(兩個引用

)的正則表示式。如下:

 程式碼如下 複製程式碼
location ~ ^.+.php {
  (...)
  fastcgi_split_path_info ^(.+.php)(.*)$;
  fastcgi_param SCRIPT_FILENAME /path/to/php$fastcgi_script_name;
  fastcgi_param PATH_INFO $fastcgi_path_info;
  fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
  (...)
}

第一個引用(.+.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] {2})([0-9] {2})([0-9] {2})" /path/to/photos/$1/$1$2/$1$2$3.png;通常環境下我們

會把它和if結合來使用:

 程式碼如下 複製程式碼

if ($host ~* www.(.*)) {
  set $host_without_www $1;
  rewrite ^(.*)$ http://$host_without_www$1 permanent; # $1為'/foo',而不是'www.mydomain.com/foo'
}

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

樣的正則:”(*UTF8)^/[x{4e00}-x{9fbf}]+)$”注意引號和前面的(*UTF8),(*UTF8)將告訴這個正則切換為UTF8模

式。

 程式碼如下 複製程式碼

[[email protected] conf]# pcretest
PCRE version 8.10 2010-06-25

  re> /^[x{4e00}-x{9fbf}]+/8
data> 測試
 0: x{6d4b}x{8bd5}
data> Nginx模組參考手冊中文版
No match
data> 參考手冊中文版
 0: x{53c2}x{8003}x{624b}x{518c}x{4e2d}x{6587}x{7248}

location順序錯誤導致下載.php原始碼而不執行php程式的問題

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

 程式碼如下 複製程式碼

location / {
        try_files $uri $uri/ /index.html;
}

location /user1/ {
      try_files $uri $uri/ /user1/index.php?q=$uri&$args;
}

location ~* ^/(user2|user3)/ {
        try_files $uri $uri/ /$1/index.php?q=$uri&$args;
}

location ~ .php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
}

=====================================

nginx.conf的配置程式碼看上去沒有任何問題,而事實上:
訪問 /user1/會正常執行php程式。
訪問 /user2/ 或 /user3/ 都不會執行程式,而是直接下載程式的原始碼。

原因在哪裡?看到他們地區別了嗎?
/user1/是普通location寫法
而/user2/ 或 /user3/ 是正則表示式匹配的location

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

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

正確的程式碼舉例:
=====================================

 程式碼如下 複製程式碼

location / {
        try_files $uri $uri/ /index.html;
}

location /user1/ {
      try_files $uri $uri/ /user1/index.php?q=$uri&$args;
}

location ~ .php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
}

location ~* ^/(user2|user3)/ {
        try_files $uri $uri/ /$1/index.php?q=$uri&$args;
}

=====================================

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

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

相關推薦

nginx 表示式匹配入門

1、nginx配置基礎 1、正則表示式匹配 ~ 區分大小寫匹配 ~* 不區分大小寫匹配 !~和!~*分別為區分大小寫不匹配及不區分大小寫不匹配 ^ 以什麼開頭的匹配 $ 以什麼結尾的匹配 轉義字元。可以轉. * ?等 * 代表任意字元 2、檔案及目錄匹配 -f和!-f用來判

Nginx表示式匹配操作符詳解

Nginx正則表示式之匹配操作符詳解 nginx可以在配置檔案中對某些內建變數進行判斷,從而實現某些功能。例如:防止rewrite、盜鏈、對靜態資源設定快取以及瀏覽器限制等等。由於nginx配置中有if指令,但是沒有對應else指令,所以判斷要分為匹配和不匹配。

Nginx模組開發中使用PCRE表示式匹配

Nginx內部對pcre庫的常用操作進行了封裝. 封裝的原始碼位於nginx/src/core/ngx_regex.c, 同時將pcre內使用的記憶體池更變為了Nginx的記憶體池. pcre_compile: Nginx封裝了pcre_compile方法. 方法名為ngx_regex_

python入門—2常見問題_1_表示式匹配中文

python2.7 在使用正則表示式來匹配中文字元時,經常會出現意想不到的問題,比如下面這個匹配問題: 1、問題 字串:      飛利浦(PHILIPS)      飛利浦(PHILIPS)      飛利浦(PHILIPS)      飛利浦(PHILIPS) 從字串中

[Swift]LeetCode10. 表示式匹配 | Regular Expression Matching

Given an input string (s) and a pattern (p), implement regular expression matching with support for '.' and '*'. '.' Matches any single cha

表示式匹配原則

基本模式匹配 一切從最基本的開始。模式,是正則表示式最基本的元素,它們是一組描述字串特徵的字元。模式可以很簡單,由普通的字串組成,也可以非常複雜,往往用特殊的字元表示一個範圍內的字元、重複出現,或表示上下文。例如: ^once 這個模式包含一個特殊的字元^,表示該模式只匹配那些以once開頭的字串。例如

表示式匹配換行符

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

PHP 表示式---匹配模式

1、PHP 正則表示式 <一>正則表示式貪婪匹配,非貪婪匹配。 預設是貪婪匹配, 例如 ①、貪婪匹配, $str = '香腸月餅'; preg_match('/(.)</td>/',$str,$rs); print_r($rs); ②、 $str = '香腸月餅'; preg_

C# -- 表示式匹配字元之含義

原文: C# -- 正則表示式匹配字元之含義 C#正則表示式匹配字元之含義 1.正則表示式的作用:用來描述字串的特徵。 2.各個匹配字元的含義: .   :表示除\n以外的單個字元 [ ]  :表示在字元陣列[]中羅列出來的字元任意取單個 |   :表示“或”的意思

劍指offer——表示式匹配(遞迴呼叫)

當模式中的第二個字元不是“*”時: 1、如果字串第一個字元和模式中的第一個字元相匹配,那麼字串和模式都後移一個字元,然後匹配剩餘的。 2、如果 字串第一個字元和模式中的第一個字元相不匹配,直接返回false。 而當模式中的第二個字元是“*”時: 如果字串第一個字元跟模式第一個字元

常用的表示式匹配數字

匹配特殊字元 匹配中文字元的正則表示式: [\u4e00-\u9fa5] 評註:匹配中文還真是個頭疼的事,有了這個表示式就好辦了 匹配雙位元組字元(包括漢字在內):[^\x00-\xff] 評註:可以用來計算字串的長度(一個雙位元組字元長度計2,ASCII字元計1)

SQL語句表示式 匹配(獲取) 所有表名

寫出匹配SQL語句中的所有表名,備忘記錄 折磨了好久,正則表示式如下: *\s+from\s+[\w ]*.?[\w ]*.? ?(\b\w+) ?(\b\w+) ?[\r\n\s]* 支援各種表示式 SELECT * FROM Config SELE

表示式匹配最後一部分

今天,同事問了我一個正則,最後解決了,給大家提供一下參考。用於取網址的最後一部分。本文用於講解(?= 和 ?<= 和 ?>=和 ?! 的用法) 資料如下: https://download.microsoft.com/download/5/3/8/5388ECC4-C2E2-

表示式匹配案例

import re import time import sys #先開啟1.txt檔案,讀取文字內容,然後建立一個匹配函式並呼叫(獲取文字的address) #終端輸入python3 本檔名.py 匹配內容(例:BATA100) #匹配具體內容 def reg(data,port): patte

劍指offer系列——陣列中重複的數字,構建乘積陣列,表示式匹配

陣列中重複的數字 題目描述 在一個長度為n的數組裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意一個重複的數字。 例如,如果輸入長度為7的陣列{2,3,1,0,2,5,3},那麼對應的輸出是第一個重複的數字2

PHP 表示式匹配函式 preg_match 與 preg_match_all

preg_match() preg_match() 函式用於進行正則表示式匹配,成功返回 1 ,否則返回 0 。 語法: 1 int preg

劍指Offer 52. 表示式匹配 (字串)

題目描述 請實現一個函式用來匹配包括'.'和'*'的正則表示式。模式中的字元'.'表示任意一個字元,而'*'表示它前面的字元可以出現任意次(包含0次)。 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串"aaa"與模式"a.a"和"ab*ac*a"匹配,但是與"aa.a"和"ab*a"均不匹配 題目地

leetcode題庫——表示式匹配

題目描述: 給定一個字串 (s) 和一個字元模式 (p)。實現支援 '.' 和 '*' 的正則表示式匹配。 '.' 匹配任意單個字元。 '*' 匹配零個或多個前面的元素。 匹配應該覆蓋整個字串 (s) ,而不是部分字串。

表示式 匹配 使用者名稱/密碼/Email/身份證

通過正則表示式匹配 使用者名稱/密碼/Email/身份證 使用者名稱(4到16位,字母數字下劃線,減號): /^[-_a-zA-Z0-9]{4,16}$/ 解釋:在字元組中表示:匹配若干字元之一,這裡就是匹配‘-’ , ‘_’ 和字母,數字其中之一,最後的{4,16}

python 表示式匹配特定浮點數

  def is_decimal(num): import re    #以數字開頭,小數點後保留1位數字或兩位數字或者沒有小數部分 dnumre = re.compile(r"""^[0-9]+(\.[0-9]{1,2})?$""") result = d