ivaneeo's blog

          自由的力量,自由的生活。

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks
          Nginx 的 location 指令,允許對不同的 URI 進行不同的配置,既可以是字符串,也可以是正則表達式。使用正則表達式,須使用以下前綴:
                  (1) ~*, 表示不區分大小寫的匹配。
                  (2) ~, 表示區分大小寫的匹配。

                  對于非正則的匹配,即字符串匹配,有如下前綴:
                  (1) ^~, 表示匹配到字符串后,終止正則匹配。
                  (2) =, 表示精確匹配。
                  (3) @, 當然,這個也算不上字符串匹配。如果可以,你也可以將其理解成是正則匹配。它是一個命名標記,這種 location 不會用于正常的請求,它們通常只用于處理內部的重定向。

                  在匹配過程中,Nginx 將首先匹配字符串,然后匹配正則表達式。匹配到第一個正則表達式后,會停止搜索。如果匹配到正則表達式,則使用正則表達式的搜索結果,如果沒有匹配到正則表達式,則使用字符串的搜索結果。

                  上面這段話的意思是說,有一個字符串和正則表達式均能匹配上,那么會使用正則表達式的搜索結果。這里,我們可以使用前綴"^~" 來禁止匹配到字符串后,繼續檢查正則表達式。匹配到 URI 后,將停止搜索。

                  使用前綴 "=" 可以進行精確的 URI 匹配,如果找到匹配的 URI,則停止搜索。"location = /" 只能匹配到 "/",而 "/test.html" 則不能被匹配。

                  正則表達式的匹配,按照它們在配置文件中的順序進行,寫在前面的優先。

                  另外,前綴 "@" 是一個命名標記,這種 location 不會用于正常的請求,它們通常只用于處理內部的重定向(例如:error_page, try_files)。

                  最后總結一下匹配的過程:
                  (1) 前綴 "=" 先進行匹配,如果找到了,終止搜索。
                  (2) 對所有其它 location 進行非正則的匹配,找到最精確匹配(對于 /blog/admin/ 這個 URI, location /blog 要比 location / 長,因此 location /blog 要比 location / 要精確)的那個。如果找到的這個是帶"^~" 前綴的,則終止搜索并直接返回找到的這個,否則開始正則查找。會不會出現所有的非正則匹配都無法匹配到 URI 呢,當然,你若不定義一個 location /,這種情況的確會發生,沒關系啊,它會進行正則查找的。
                  (3) 正則查找,按照我們配置文件中配置的 location 順序進行查找。

                  (4) 如果正則查找匹配成功,則使用此正則匹配的 location,否則,使用第二步查找的結果。如果『否則』發生了,同時,第二步中的粗體字部分的假設的情況也發生了,怎么辦?404 會等著你的。


          參考:nginx location的管理以及查找


          例子:

          location = / {
          # 只匹配 / 查詢。
          [ configuration A ]
          }

          location / {
          # 匹配任何查詢,因為所有請求都已 / 開頭。但是正則表達式規則和長的塊規則將被優先和查詢匹配。
          [ configuration B ]
          }

          location ^~ /images/ {
          # 匹配任何已 /images/ 開頭的任何查詢并且停止搜索。任何正則表達式將不會被測試。
          [ configuration C ]
          }

          location ~* \.(gif|jpg|jpeg)$ {
          # 匹配任何已 gif、jpg 或 jpeg 結尾的請求。然而所有 /images/ 目錄的請求將使用 Configuration C。
          [ configuration D ]
          }

          例子請求:

          1, /   ->   精確匹配到第1個location,匹配停止,使用configuration A
          2,/some/other/url    ->  首先前綴部分字符串匹配到了第2個location,然后進行正則匹配,顯然沒有匹配上,則使用第2個location的配置configurationB
          3,/images /1.jpg  ->  首先前綴部分字符串匹配到了第2個location,但是接著對第3個location也前綴匹配上了,而且這時已經是配置文件里面對這個url的最大字 符串匹配了,并且location帶有 "^~" 前綴,則不再進行正則匹配,最終使用configuration C
          4,/some/other/path/to/1.jpg  -> 首先前綴部分同樣字符串匹配到了第2個location,然后進行正則匹配,這時正則匹配成功,則使用congifuration D

          注意:按任意順序定義這4個配置結果將仍然一樣。

          posted on 2012-04-17 19:45 ivaneeo 閱讀(1055) 評論(0)  編輯  收藏 所屬分類: 互聯網
          主站蜘蛛池模板: 奈曼旗| 新邵县| 黎平县| 任丘市| 和平县| 德安县| 城口县| 巨野县| 拉萨市| 紫金县| 甘谷县| 株洲市| 山丹县| 普格县| 福鼎市| 大悟县| 即墨市| 通榆县| 林甸县| 颍上县| 中牟县| 天气| 黄平县| 青浦区| 迁安市| 独山县| 长沙市| 神池县| 礼泉县| 醴陵市| 乌拉特中旗| 东乡族自治县| 彰武县| 鸡泽县| 昭平县| 陵水| 叙永县| 岚皋县| 新民市| 卢龙县| 原平市|