1. 程式人生 > >nginx中的rewrite用法及例項

nginx中的rewrite用法及例項

本文轉載自http://blog.csdn.net/xy2204/article/details/47749405,本來想自己總結的,但還是覺得人家寫的更好一些,所以就轉載下來。最下面附有我的一個小例子。

location表示式型別

  • ~ 表示執行一個正則匹配,區分大小寫
  • ~* 表示執行一個正則匹配,不區分大小寫
  • ^~ 表示普通字元匹配。使用字首匹配。如果匹配成功,則不再匹配其他location。
  • = 進行普通字元精確匹配。也就是完全匹配。
  • @ 它定義一個命名的 location,使用在內部定向時,例如 error_page, try_files

location優先順序說明

在nginx的location和配置中location的順序沒有太大關係。正location表示式的型別有關。相同型別的表示式,字串長的會優先匹配。

以下是按優先順序排列說明:

  1. 等號型別(=)的優先順序最高。一旦匹配成功,則不再查詢其他匹配項。
  2. ^~型別表示式。一旦匹配成功,則不再查詢其他匹配項。
  3. 正則表示式型別(~ ~*)的優先順序次之。如果有多個location的正則能匹配的話,則使用正則表示式最長的那個。
  4. 常規字串匹配型別。按字首匹配。

location優先順序示例

配置項如下:

  1. location =/{
  2. # 僅僅匹配請求 /
  3. [ configuration A ]
  4. }
  5. location /{
  6. # 匹配所有以 / 開頭的請求。
  7. # 但是如果有更長的同類型的表示式,則選擇更長的表示式。
  8. # 如果有正則表示式可以匹配,則優先匹配正則表示式。
  9. [ configuration B ]
  10. }
  11. location /documents/{
  12. # 匹配所有以 /documents/ 開頭的請求。
  13. # 但是如果有更長的同類型的表示式,則選擇更長的表示式。
  14. # 如果有正則表示式可以匹配,則優先匹配正則表示式。
  15. [ configuration C ]
  16. }
  17. location ^~/images/{
  18. # 匹配所有以 /images/ 開頭的表示式,如果匹配成功,則停止匹配查詢。
  19. # 所以,即便有符合的正則表示式location,也不會被使用
  20. [ configuration D ]
  21. }
  22. location ~* \.(gif|jpg|jpeg)$ {
  23. # 匹配所有以 gif jpg jpeg結尾的請求。
  24. # 但是 以 /images/開頭的請求,將使用 Configuration D
  25. [ configuration E ]
  26. }

請求匹配示例

  1. /-> configuration A
  2. /index.html -> configuration B
  3. /documents/document.html -> configuration C
  4. /images/1.gif-> configuration D
  5. /documents/1.jpg-> configuration E

注意,以上的匹配和在配置檔案中定義的順序無關。

1. location正則寫法

一個示例:

  1. location =/{
  2. # 精確匹配 / ,主機名後面不能帶任何字串
  3. [ configuration A ]
  4. }
  5. location /{
  6. # 因為所有的地址都以 / 開頭,所以這條規則將匹配到所有請求
  7. # 但是正則和最長字串會優先匹配
  8. [ configuration B ]
  9. }
  10. location /documents/{
  11. # 匹配任何以 /documents/ 開頭的地址,匹配符合以後,還要繼續往下搜尋
  12. # 只有後面的正則表示式沒有匹配到時,這一條才會採用這一條
  13. [ configuration C ]
  14. }
  15. location ~/documents/Abc{
  16. # 匹配任何以 /documents/ 開頭的地址,匹配符合以後,還要繼續往下搜尋
  17. # 只有後面的正則表示式沒有匹配到時,這一條才會採用這一條
  18. [ configuration CC ]
  19. }
  20. location ^~/images/{
  21. # 匹配任何以 /images/ 開頭的地址,匹配符合以後,停止往下搜尋正則,採用這一條。
  22. [ configuration D ]
  23. }
  24. location ~* \.(gif|jpg|jpeg)$ {
  25. # 匹配所有以 gif,jpg或jpeg 結尾的請求
  26. # 然而,所有請求 /images/ 下的圖片會被 config D 處理,因為 ^~ 到達不了這一條正則
  27. [ configuration E ]
  28. }
  29. location /images/{
  30. # 字元匹配到 /images/,繼續往下,會發現 ^~ 存在
  31. [ configuration F ]
  32. }
  33. location /images/abc {
  34. # 最長字元匹配到 /images/abc,繼續往下,會發現 ^~ 存在
  35. # F與G的放置順序是沒有關係的
  36. [ configuration G ]
  37. }
  38. location ~/images/abc/{
  39. # 只有去掉 config D 才有效:先最長匹配 config G 開頭的地址,繼續往下搜尋,匹配到這一條正則,採用
  40. [ configuration H ]
  41. }
  42. location ~*/js/.*/\.js
  • =開頭表示精確匹配
    如 A 中只匹配根目錄結尾的請求,後面不能帶任何字串。
  • ^~ 開頭表示uri以某個常規字串開頭,不是正則匹配
  • ~ 開頭表示區分大小寫的正則匹配;
  • ~* 開頭表示不區分大小寫的正則匹配
  • / 通用匹配, 如果沒有其它匹配,任何請求都會匹配到

順序不等於優先順序:

(location =) > (location 完整路徑) > (location ^~ 路徑) > (location ~,~* 正則順序) > (location 部分起始路徑) > (/)

上面的匹配結果。按照上面的location寫法,以下的匹配示例成立:

  • / -> config A
    精確完全匹配,即使/index.html也匹配不了
  • /downloads/download.html -> config B
    匹配B以後,往下沒有任何匹配,採用B
  • /images/1.gif -> configuration D
    匹配到F,往下匹配到D,停止往下
  • /images/abc/def -> config D
    最長匹配到G,往下匹配D,停止往下
    你可以看到 任何以/images/開頭的都會匹配到D並停止,FG寫在這裡是沒有任何意義的,H是永遠輪不到的,這裡只是為了說明匹配順序
  • /documents/document.html -> config C
    匹配到C,往下沒有任何匹配,採用C
  • /documents/1.jpg -> configuration E
    匹配到C,往下正則匹配到E
  • /documents/Abc.jpg -> config CC
    最長匹配到C,往下正則順序匹配到CC,不會往下到E

實際使用建議

所以實際使用中,個人覺得至少有三個匹配規則定義,如下:

  1. #直接匹配網站根,通過域名訪問網站首頁比較頻繁,使用這個會加速處理,官網如是說。
  2. #這裡是直接轉發給後端應用伺服器了,也可以是一個靜態首頁
  3. # 第一個必選規則
  4. location =/{
  5. proxy_pass http://tomcat:8080/index
  6. }
  7. # 第二個必選規則是處理靜態檔案請求,這是nginx作為http伺服器的強項
  8. # 有兩種配置模式,目錄匹配或字尾匹配,任選其一或搭配使用
  9. location ^~/static/{
  10. root /webroot/static/;
  11. }
  12. location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
  13. root /webroot/res/;
  14. }
  15. # 第三個規則就是通用規則,用來轉發動態請求到後端應用伺服器
  16. # 非靜態檔案請求就預設是動態請求,自己根據實際把握
  17. # 畢竟目前的一些框架的流行,帶.php,.jsp字尾的情況很少了
  18. location /{
  19. proxy_pass http://tomcat:8080/
  20. }

參考:

2. Rewrite規則

rewrite功能就是,使用nginx提供的全域性變數或自己設定的變數,結合正則表示式和標誌位實現url重寫以及重定向。rewrite只能放在server{},location{},if{}中,並且只能對域名後邊的除去傳遞的引數外的字串起作用,例如http://seanlook.com/a/we/index.PHP?id=1&u=str 只對/a/we/index.php重寫。語法rewrite regex replacement [flag];

如果相對域名或引數字串起作用,可以使用全域性變數匹配,也可以使用proxy_pass反向代理。

表明看rewrite和location功能有點像,都能實現跳轉,主要區別在於rewrite是在同一域名內更改獲取資源的路徑,而location是對一類路徑做控制訪問或反向代理,可以proxy_pass到其他機器。很多情況下rewrite也會寫在location裡,它們的執行順序是:

  1. 相關推薦

    nginxrewrite用法例項

    本文轉載自http://blog.csdn.net/xy2204/article/details/47749405,本來想自己總結的,但還是覺得人家寫的更好一些,所以就轉載下來。最下面附有我的一個小例子。 location表示式型別 ~ 表示執行一

    nginxrewrite用法

    rate 條件判斷 特殊字符 服務器名稱 區別 參數說明 正則表達 index.php 否則 nginx中rewrite用法一、rewrite規則rewrite功能就是使用nginx提供的全局變量或自己設置的變量,結合正則表達式和標誌位實現url重寫以及重定向。rewrit

    SQL 函式 REPLACE() 的用法例項

    一、定義:   官方語法: REPLACE ( string_expression , string_pattern , string_replacement )   引數含義: string_expression 要搜尋的字串表示式。string_expression 可以

    SQLSUBSTRING函式的用法例項解析

    一、定義:SQL 中的 substring 函式是用來擷取字串中的一部分字元。這個函式的名稱在不同的資料庫中不完全一樣。 MySQL: SUBSTR( ), SUBSTRING( ) Oracle: SUBSTR( ) SQL Server: SUB

    【Java學習筆記之二十二】解析接口在Java繼承用法實例分析

    ani 復制代碼 ads compute 現在 target body 常量 實現接口 一、定義 Java接口(Interface),是一系列方法的聲明,是一些方法特征的集合,一個接口只有方法的特征沒有方法的實現,因此這些方法可以在不同的地方被不同的類實現,而這些實現可以具

    nginxlocation配置匹配詳解

    back amp 告訴 正則表達式 順序 win http 方法 ext nginx中location配置及匹配詳解1、location語法規則 Location 基礎知識1.location 是在 server 塊中配置。2.可以根據不同的 URI 使用不同的配置(loc

    Android開發XRecyclerview用法遇到的一些問題

    解決 pos sage head ebe 專業 剛才 adapt 只需要 目前通過xrecyclerview的開源代碼來實現系列功能,加載數據傳入type,值為1,2,3,分別表示初次加載,下拉刷新數據,上拉加載更多數據操作,刷新數據只需要重新放入數據,然後notifyDa

    JavacompareTo用法原始碼解析

    最近遇到一個問題,在日期比較的時候,很麻煩,因為日期比較沒有大於等於,只有大於或者小於,這就導致在比較時間的時候特別麻煩,而且還要由string轉成date格式才能比較,下面是我使用compareTo比較時間字串的程式碼: String putStartTime = Date

    tf.tile()用法例項

    tf.tile( input, #輸入 multiples, #某一維度上覆制的次數 name=None ) 例項 import tensorflow as tf a = tf.tile([1,2,3],[2]) b = tf.tile([[

    MysqlJoin用法優化

    Join的幾種型別   笛卡爾積(交叉連線)  如果A表有n條記錄,B表有m條記錄,笛卡爾積產生的結果就會產生n*m條記錄。在MySQL中可以為CROSS JOIN或者省略CROSS即JOIN如 SELECT * FROM table1 CROSS JOIN table2&

    易語言多項選擇用法例項

    哈哈.最近發現個好玩的易語言命令啊...相當於幾個如果真 就是多項選擇這個命令...看下多項選擇的說明 呼叫格式: 〈通用型〉 多項選擇 (整數型 索引值,通用型 待選擇項資料,... ) - 系統核心支援庫->其他     英文名稱:choose     從引數列

    STLsort用法例項

    #include<iostream> #include<vector> #include<algorithm> using namespace std; #define stlforeach(type,iter,container) ty

    FastJsonJSONObject用法常用方法總結

    SON協議使用方便,越來越流行,JSON的處理器有很多,這裡我介紹一下FastJson,FastJson是阿里的開源框架,被不少企業使用,是一個極其優秀的Json框架,Github地址: FastJson FastJson對於json格式字串的解析主要用到了下面三個類: 1.JSON:f

    SQL SERVER case的用法例項

    1.  官方釋義 計算條件表示式,並返回多個可能的結果表示式之一。    CASE 簡單表示式,它通過將表示式與一組簡單的表示式進行比較來確定結果。    CASE 搜尋表示式,它通過計算一組布林表示式來確定結果。 這兩種格式都支援可選的 ELSE 引數。 CASE

    linux export 用法環境變數

     Linux export命令用於設定或顯示環境變數。 在shell中執行程式時,shell會提供一組環境變數。export可新增,修改或刪除環境變數,供後續執行的程式使用。 一、語法如下: export [-fnp][變數名稱]=[變數設定值] 引數說明: -f  代表[

    Javaforeach用法常用集合操作

    foreach語句是java5的新特徵之一,在遍歷陣列、集合方面,foreach為開發人員提供了極大的方便。  foreach語句是for語句的特殊簡化版本,但是foreach語句並不能完全取代for語句,然而,任何的foreach語句都可以改寫為for語句版本。  for

    switch的用法例項分析

    switch的用法 其具有一定的形式 swith<表示式> { case<常量表達式1>:語句序列 1; case<常量表達式2>:語句序列 2; ... case<常量表達式i>

    C#keybd_event 用法鍵碼參照

    Windows提供了一個模擬鍵盤API函式Keybd_event(),該函式能觸發一個按鍵事件,也就是說會產生一個WM_KEYDOWN或WM_KEYUP訊息。 [DllImport("user32.dll", EntryPoint = "keybd_event")] pu

    Map.Entry()entryset()用法Map遍歷

    Map map=new HashMap();Iterator it=map.keySet().iterator();Object key;Object value;while(it.hasNext()){key=it.next();value=map.get(key);System.out.println(k

    EXCEL 自定義函式的應用(關於 XOR 在 EXCEL 用法 文字型數字求和)

    EXCEL 中,能否同調用內建函式一樣在工作表中呼叫自已製作的自定義函式,出現對話方塊.同時也能做到像內建函式對話方塊裡的說明?答案是肯定的,下面舉例說明:題目: ①對文字型一系列數字進行求和(SUM()返回0)              ②對數值型的一系列數字異或操作(EX