天天看點

Nginx裡的正規表達式

URL和URI

nginx.conf裡面有幾個大闆塊,第一部分是event,裡面是設定最大并發數量。然後是各種協定,比如http\https\mail,一個http協定裡面可以有多個server,每一個server對應的就是一個網站,在生産中,server 1和server 2乃至server n如果是虛拟主機的話,那麼他們的内容是一樣的,這樣要是server 1的伺服器負載壓力過大, nginx會啟動負載均衡把使用者都引向相對負載壓力較小的伺服器,以此達到保護伺服器的目的。

而server下面可以有多個location,而location裡就需要根據情況填寫URI,那什麼是URI呢?

URL:統一資源定位符

URI:同一資源辨別符

舉個例子:www.yahoo.com/nba/GoldenWarriors/players-curry.html,這一大串就是一個url,而uri指的是後面nba/GoldenWarriors/players-curry.html這一段。

nginx還有一個變量叫document_uri,他跟uri顯示的東西是一回事。

Location裡的比對句式

location這個參數可以根據uri的不同需求進行配置,可以使用字元串和正規表達式比對,使用字元串的話沒啥說的,寫啥就是對應啥;如果要使用正規表達式的話,文法是這樣的:location [=|~|~*|^~] /uri/ {……},說一下中括号裡各個東西的意思:

~:區分大小寫;

~*:不區分大小寫;

^~:比對,但是不是精确比對,比如請求為/static/20%/aa,可以被規則^~ /static/ /aa比對到;

=:精确比對。下面舉幾個例子

1、location =/ {

    裡面就是各個的詳細資訊

        }

這個使用了"=",是以采用的是精确比對“/”,即隻能通路nginx安裝檔案夾裡的第一層所有檔案,第二層的乃至更深的檔案都無法通路。同理,當拒絕某ip通路的時候,也是僅僅拒絕這個ip位址通路“/”這個檔案夾。

2、location /{

    裡面是各種配置資訊

    }

這裡沒有采用"=",也就是說隻要是nginx安裝檔案夾下的所有檔案,不管是第幾層,隻要在這個檔案夾下都可以通路。

3、location ^~/images/{

首先這裡先确定範圍是nginx安裝目錄下的images檔案下的所有子檔案(包括其子檔案夾),但是前面使用了^~,意思是禁止表達式比對。

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

不區分大小的比對所有以.gif/.jpg/.jpeg結尾的檔案夾,但是要注意,如果這個4号式子與上面那個3号式子一起寫,無論是3上4下,還是4上3下,/images/下的檔案會優先被3号式子選出。

比如,在nginx安裝檔案夾下有這樣一個檔案/images/1.gif。雖然它也是gif結尾,但是由于3式子對檔案夾的範圍更精确,是以被3先挑出來,但是由于後面的^~,就脫離了正則的範圍。不進入4的控制裡。而如果有/AAA/1.jpg。這個檔案就會被4挑選出來。

舉幾個例子,就會更容易加深了解:

1)要求:abc.domian.com/sort/2 => abc.domian.com/index.php?act=sort&name=abc&id=2

配置如下:

1

2

3

4

5

6

<code>location {</code>

<code>        </code><code>if</code> <code>($host ~* (.*)\domain.\com){</code>

<code>            </code><code>set</code> <code>$sub_name $1;</code>

<code>            </code><code>rewrite ^</code><code>/sort</code><code>\/(\d+)\/?$ </code><code>/index</code><code>.php?act=</code><code>sort</code><code>&amp;name=abc&amp;</code><code>id</code><code>=$1 last;</code>

<code>            </code><code>}</code>

<code>        </code><code>}</code>

【評析】(\d)代表數字,(\d+)代表一個或者多個數字。

2)要求:/123456/xxxx -&gt; /xxxx?id=123456

7

<code>location{</code>

<code>        </code><code>if</code> <code>($uri ~* </code><code>/123456/</code><code>(.*)){</code>

<code>            </code><code>set</code> <code>$args_1 $1;</code>

<code>            </code><code>set</code> <code>$args_2 $2;</code>

<code>            </code><code>rewrite ^/(\d+)/(.+) /$2?</code><code>id</code><code>=$1last;</code>

【評析】(.+)是貪婪比對,就是什麼都要;而比如說(.+K)就是挑出一個或者多個字元後面跟一個K。

 本文轉自 蘇幕遮618 51CTO部落格,原文連結:http://blog.51cto.com/chenx1242/1749737

繼續閱讀