1. 程式人生 > >Nginx路由簡單解析--php正則表示式與例項解析

Nginx路由簡單解析--php正則表示式與例項解析

一條簡單的路由

(以下內容都是我當時有限的理解,後面自己理解深入了再更新,有錯誤也希望能幫忙指正下)

在webserver環境裡,我們經常要用到路由,將url重寫解析,才能訪問到真正的介面。

以Nginx為例,一個http請求(或者其他協議)通過網頁或者端上傳送到伺服器上,這裡的伺服器只的是物理伺服器,相當於電腦,電腦上裝有Nginx伺服器。

這裡需要提的一點是,Nginx和Apache的側重點不同,Apache側重在完整穩定上,而Nginx側重在輕量高效上,很多時候Apache和Nginx是配合使用的,Nginx配置在Apache前面,用它擋掉靜態檔案的請求(網站今天資源的請求佔了大部分的),Nginx處理不了的內容菜才轉發給Apache來處理。

這裡我只拿單Nginx考慮。一個到了Nginx的url,通過反向代理訪問到內網,會在webserver層被路由重寫。(我的重寫檔案在~/webserver/conf/vhost/php.conf),在被處理後的uri會接著被框架下的重寫規則重寫,然後才能訪問真正的介面/檔案。

舉其中最簡單的一條重寫規則。

rewrite ^/([^/.]*)(/[^\?]*)?((\?.*)?)$ /$1/index.php$2$3 break

這條規則的結果是 將 http://www.test.com/hi/word 重寫為 http://www.test.com/hi/index.php/word,我們可以在webroot下的hi模組下找到index.php這個檔案。

index.php的作用是例項化框架

現在,我們來解析下這一條規則究竟做了什麼

php正則

先學習下PHP正則表示式的知識。

1. 定位符

定位符用於規定匹配模式在目標物件中出現位置。常用的有"^"、"$"、"\b"、“\B”

(1)“^”定位符規定匹配模式必須出現在目標字串的開頭
(2)“$”定位符規定匹配模式必須出現在目標物件的結尾
(3)\b定位符規定匹配模式必須出現在目標字串的開頭或結尾的兩個邊界之一
(4)“\B”定位符則規定匹配物件必須位於目標字串的開頭和結尾兩個邊界之內

這裡就規定了上面例子的匹配位置
2.定界符

“/”是定界符,“/”定界符之間的部分就是將要在目標物件中進行匹配的模式。

(1)“+”元字元規定其前導字元必須在目標物件中連續出現一次或多次
比如:/php+/,能夠與“phpp”匹配
(2)“*”元字元規定其前導字元必須在目標物件中出現零次或連續多次
比如:/php*/能夠與“phpddt”相匹配
(3)“?”元字元規定其前導物件必須在目標物件中連續出現零次或一次。
比如:/php?/能夠“phpr”匹配

惰性匹配(記住:會進行兩部操作,請看下面的原理部分)

格式:限定符?

原理:”?”:如果前面有限定符,會使用最小的資料。如“*”會取0個,而“+”會取1個,如過是{3,5}會取3個。

3. 否定符

[^]規定目標物件中不能存在模式中規定的字串

[^phpddt]匹配除了phpddt字元外的所有東西

總結

ok,結合一二三三點來看,([^/.]*)對應$1,(/[^\?]*)對應$2,[^/.]和[^\?]篩選了元字元和一些符號防止惡意訪問。

“?“後面為如果存在url引數的處理,這個就留著大家自己思考吧!