Nginx的location語法規則

一、介紹

location指令是http模塊當中最核心的一項配置,根據預先定義的URL匹配規則來接收用戶發送的請求,根據匹配結果,將請求轉發到後臺服務器、非法的請求直接拒絕並返回40三、40四、500錯誤處理等。html

二、location指令語法

location [=|~|~*|^~|@] /uri/ { … } 或 location @name { … }nginx

三、URI匹配模式

location指令分爲兩種匹配模式:正則表達式

  • 1> 普通字符串匹配:以=開頭或開頭無引導字符(~)的規則
  • 2> 正則匹配:以~或~*開頭表示正則匹配,~*表示正則不區分大小寫

四、location URI匹配規則

  • (1)當nginx收到一個請求後,會截取請求的URI部份,去搜索全部location指令中定義的URI匹配模式。
  • (2)在server模塊中能夠定義多個location指令來匹配不一樣的url請求,多個不一樣location配置的URI匹配模式,整體的匹配原則是:先匹配普通字符串模式(普通匹配,匹配到會暫存,繼續搜索正則匹配),再匹配正則模式(正則模式匹配到,即爲最終匹配)。只識別URI部份,例如請求爲:/test/abc/user.do?name=xxxx 一個請求過來後,Nginx匹配這個請求的流程以下:
  • 先查找是否有=開頭的精確匹配,如:location = /test/abc/user.do { … }
  • 再查找普通匹配,以最大前綴爲原則,若有如下兩個location,則會匹配後一項
location /test/ { … }
location /test/abc { … }
複製代碼
  • 匹配到一個普通格式後,搜索並未結束,而是暫存當前匹配的結果,並繼續搜索正則匹配模式
  • 全部正則匹配模式location中找到第一個匹配項後,就以此項爲最終匹配結果 因此正則匹配項匹配規則,受定義的先後順序影響,但普通匹配模式不會
  • 若是未找到正則匹配項,則以3中緩存的結果爲最終匹配結果
  • 若是一個匹配都沒搜索到,則返回404

五、精確匹配與模糊匹配差異

location =/ { … }location / { … } 的差異:緩存

  • 前一個是精確匹配,只響應/請求,全部/xxx或/xxx/xxxx類的請求都不會之前綴的形式匹配到它
  • 後一個是隻要以 / 爲前綴的請求都會被匹配到。如:/abc , /test/abc, /test/abc/aaaa

六、正則與非正則匹配

location ~ /test/.+.jsp$ { … } :正則匹配,支持標準的正則表達式語法。 location ^~ / { … } : ^~意思是關閉正則匹配,當搜索到這個普通匹配模式後,將再也不繼續搜索正則匹配模式。bash

http {
    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
            # deny all; 拒絕請求,返回403
            # allow all; 容許請求
        }

        location /abc {
            deny all;
        }

        location ~ /.+\.jsp$ {
            proxy_pass http://location:9090;
        }

        # 匹配全部/test路徑下的jsp文件
        location ~ /test/.+\.jsp$ {
            proxy_pass http://localhost:8080;
        }

        # 定義各種錯誤頁
        error_page 404  /404.html

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # @相似於變量定義
        # error_page 403 http://blog.csdn.net; #這種定義不容許,需求利用@定義臨時變量來實現
        error_page 403 @page403;
        location @page403 {
            proxy_pass http://blog.csdn.net;
        } 
    }
}
複製代碼
相關文章
相關標籤/搜索