1. location的配置
語法規則
location [=|~|~*|^~] /uri/ { … }
-
~ 為區分大小寫匹配(可用正規表示式)
-
!~ 為區分大小寫不匹配
-
~* 為不區分大小寫匹配(可用正規表示式)
-
!~* 為不區分大小寫不匹配
-
^~ 開頭表示uri以某個常規字串開頭,Nginx將在這個字串匹配後停止進行正規表示式的匹配(location指令中正規表示式的匹配的結果優先使用),如:
location ^~/images/
,你希望對/images/這個目錄進行一些特別的操作,如增加expires頭,防盜鏈等,但是你又想把除了這個目錄的圖片外的所有圖片只進行增加expires頭的操作,這個操作可能會用到另外一個location,例如:location ~*\.(gif|jpg|jpeg)$
,這樣,如果有請求/images/1.jpg
,Nginx如何決定去進行哪個location中的操作呢?結果取決於識別符號^~,如果你這樣寫:location /images/
,這樣Nginx會將1.jpg匹配到location ~*\.(gif|jpg|jpeg)$
這個location中,這並不是你需要的結果,而增加了^~這個識別符號後,它在匹配了/images/這個字串後就停止搜尋其它帶正則的location。Nginx不對url做編碼,因此請求為/static/20%/aa
,可以被規則^~ /static/ /aa
匹配到(注意是空格)。 -
= 表示精確的查詢地址,如
location=/
它只會匹配uri為/的請求,如果請求為/index.html,將查詢另外的location,而不會匹配這個,當然可以寫兩個location,location = /
和location /
,這樣/index.html將匹配到後者,如果你的站點對/的請求量較大,可以使用這個方法來加快請求的響應速度。 -
@ 表示為一個location進行命名,即自定義一個location,這個location不能被外界所訪問,只能用於Nginx產生的子請求,主要為error_page和try_files。
優先順序順序
(location =) > (location 完整路徑) > (location ^~ 路徑) > (location ~,~* 正則順序) > (location 部分起始路徑) > (/)
示例
location = / {
# 只匹配 / 查詢。
}
location / {
# 匹配任何查詢,因為所有請求都已 / 開頭。但是正規表示式規則和長的塊規則將被優先和查詢匹配。
}
location ^~ /images/ {
# 匹配任何已 /images/ 開頭的任何查詢並且停止搜尋。任何正規表示式將不會被測試。
}
location ~*.(gif|jpg|jpeg)$ {
# 匹配任何已 gif、jpg 或 jpeg 結尾的請求。
}
複製程式碼
2. Rewrite
location ^~/proxy/html/{
rewrite ^/proxy/html/(.*)$ /$1 break;
proxy_pass http://www.b.com/;
}
複製程式碼
以下做一個解釋:
^~ /proxy/html/
攔截請求,匹配任何以/proxy/html/
開頭的地址,匹配符合以後,停止往下搜尋正則。
rewrite ^/proxy/html/(.*)$ /$1 break;
重寫攔截進來的請求,並且只能對域名後邊的除去傳遞的引數外的字串起作用,例如傳入www.c.com/proxy/html/api/msg?method=1¶=2
,只對/proxy/html/api/msg
重寫。
rewrite後面的引數是一個簡單的正則 ^/proxy/html/(.*)$ ,$1代表正則中的第一個(),$2代表第二個()的值,以此類推。
break代表匹配一個之後停止匹配。
proxy_pass
既是把請求代理到其他主機,其中 http://www.b.com/
寫法和 http://www.b.com
寫法的區別如下:
不帶/
location /html/
{
proxy_pass http://b.com:8300;
}
複製程式碼
帶/
location /html/
{
proxy_pass http://b.com:8300/;
}
複製程式碼
上面兩種配置,區別只在於proxy_pass轉發的路徑後是否帶 “/”。
針對情況1,如果訪問url = http://server/html/test.jsp
,則被nginx代理後,請求路徑會變為http://proxy_pass/html/test.jsp
,將test/ 作為根路徑,請求test/路徑下的資源。
針對情況2,如果訪問url = http://server/html/test.jsp
,則被nginx代理後,請求路徑會變為http://proxy_pass/test.jsp
,直接訪問server的根資源。
修改配置後重啟nginx代理就成功了。