1. location的配置
語法規(guī)則
location [=|~|~*|^~] /uri/ { … }
~ 為區(qū)分大小寫匹配(可用正則表達式)
!~為區(qū)分大小寫不匹配
~* 為不區(qū)分大小寫匹配(可用正則表達式)
!~*為不區(qū)分大小寫不匹配
^~ 開頭表示uri以某個常規(guī)字符串開頭,Nginx將在這個字符串匹配后停止進行正則表達式的匹配(location指令中正則表達式的匹配的結果優(yōu)先使用),如: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,可以被規(guī)則^~ /static/ /aa匹配到(注意是空格)。
=????? 表示精確的查找地址,如location = /它只會匹配uri為/的請求,如果請求為/index.html,將查找另外的location,而不會匹配這個,當然可以寫兩個location,location = /和location /,這樣/index.html將匹配到后者,如果你的站點對/的請求量較大,可以使用這個方法來加快請求的響應速度。
@????? 表示為一個location進行命名,即自定義一個location,這個location不能被外界所訪問,只能用于Nginx產生的子請求,主要為error_page和try_files。
優(yōu)先級順序
(location =) > (location 完整路徑) > (location ^~ 路徑) > (location ~,~* 正則順序) > (location 部分起始路徑) > (/)
示例
location = / {
# 只匹配 / 查詢。
}
location / {
# 匹配任何查詢,因為所有請求都已 / 開頭。但是正則表達式規(guī)則和長的塊規(guī)則將被優(yōu)先和查詢匹配。
}
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/;
}
以下做一個解釋:
1.
^~ /proxy/html/?
攔截請求,匹配任何以/proxy/html/開頭的地址,匹配符合以后,停止往下搜索正則。
2.
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代表匹配一個之后停止匹配。
3.
proxy_pass
既是把請求代理到其他主機,其中 http://www.b.com/ 寫法和?http://www.b.com寫法的區(qū)別如下:
不帶/
location /html/
{
proxy_pass http://b.com:8300;?
}
帶/
location /html/?
{?
????proxy_pass http://b.com:8300/;?
}
上面兩種配置,區(qū)別只在于proxy_pass轉發(fā)的路徑后是否帶 “/”。
針對情況1,如果訪問url = http://server/html/test.jsp,則被nginx代理后,請求路徑會便問http://proxy_pass/html/test.jsp,將test/ 作為根路徑,請求test/路徑下的資源。
針對情況2,如果訪問url = http://server/html/test.jsp,則被nginx代理后,請求路徑會變?yōu)?http://proxy_pass/test.jsp,直接訪問server的根資源。
修改配置后重啟nginx代理就成功了。