nginx location 練習(xí)
Nginx location 配置踩坑過程分享
nginx配置location總結(jié)及rewrite規(guī)則寫法
location 匹配規(guī)則
在頁面輸出 nginx 配置文件
server {
listen 80;
server_name tmp.kaibuy.cn;
index index.php;
root /home/web/blog/public/www;
#error_page 404 /404.html;
location / {
default_type text/plain;
gzip off;
set $str "This Host : ";
return 200 "$str $http_host";
}
access_log off;
}
- default_type text/plain;是指定以文本方式打印,如果不加這句,搞不好會以下載文件的方式出現(xiàn)。當(dāng)然也可以指定為HTML,具體代碼見后面的mime.types中。
- gzip off;關(guān)閉壓縮,也可以不關(guān),這個不重要。
- set $str "This Host : ";設(shè)定一個變量,如果變量內(nèi)容是單詞,也可以:set $str MyValue;,這種不帶引號時,中間不能有空格即可。
- return 200 "$str $http_host";返回內(nèi)容體,前面200是狀態(tài)碼,可以是任意符合HTML狀態(tài)碼的代碼,這任意。后面引號里的是兩個變量,$str是剛才定義的變量,$http_host是nginx系統(tǒng)變量。這兒也可以寫成return 200 $str$http_host;也就是不帶引號,但變量之間要是連續(xù)的,不能有空格。
location = / {
# 精確匹配 / ,主機(jī)名后面不能帶任何字符串
[ configuration A ]
}
location / {
# 因?yàn)樗械牡刂范家?/ 開頭,所以這條規(guī)則將匹配到所有請求
# 但是正則和最長字符串會優(yōu)先匹配
[ configuration B ]
}
location /documents/ {
# 匹配任何以 /documents/ 開頭的地址,匹配符合以后,還要繼續(xù)往下搜索
# 只有后面的正則表達(dá)式?jīng)]有匹配到時,這一條才會采用這一條
[ configuration C ]
}
location ~ /documents/Abc {
# 匹配任何以 /documents/Abc 開頭的地址,匹配符合以后,還要繼續(xù)往下搜索
# 只有后面的正則表達(dá)式?jīng)]有匹配到時,這一條才會采用這一條
[ configuration CC ]
}
location ^~ /images/ {
# 匹配任何以 /images/ 開頭的地址,匹配符合以后,停止往下搜索正則,采用這一條。
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配所有以 gif,jpg或jpeg 結(jié)尾的請求
# 然而,所有請求 /images/ 下的圖片會被 config D 處理,因?yàn)?^~ 到達(dá)不了這一條正則
[ configuration E ]
}
location /images/ {
# 字符匹配到 /images/,繼續(xù)往下,會發(fā)現(xiàn) ^~ 存在
[ configuration F ]
}
location /images/abc {
# 最長字符匹配到 /images/abc,繼續(xù)往下,會發(fā)現(xiàn) ^~ 存在
# F與G的放置順序是沒有關(guān)系的
[ configuration G ]
}
location ~ /images/abc/ {
# 只有去掉 config D 才有效:先最長匹配 config G 開頭的地址,繼續(xù)往下搜索,匹配到這一條正則,采用
[ configuration H ]
}
location ~* /js/.*/\.js
- 以=開頭表示精確匹配
如 A 中只匹配根目錄結(jié)尾的請求,后面不能帶任何字符串。 - ^~ 開頭表示uri以某個常規(guī)字符串開頭,不是正則匹配
- ~ 開頭表示區(qū)分大小寫的正則匹配;
- ~* 開頭表示不區(qū)分大小寫的正則匹配
- / 通用匹配, 如果沒有其它匹配,任何請求都會匹配到
順序 no優(yōu)先級:
(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并停止,F(xiàn)G寫在這里是沒有任何意義的,H是永遠(yuǎn)輪不到的,這里只是為了說明匹配順序 - /documents/document.html -> config C
匹配到C,往下沒有任何匹配,采用C - /documents/1.jpg -> configuration E
匹配到C,往下正則匹配到E - /documents/Abc.jpg -> config CC
最長匹配到C,往下正則順序匹配到CC,不會往下到E
實(shí)際使用建議
所以實(shí)際使用中,個人覺得至少有三個匹配規(guī)則定義,如下:
直接匹配網(wǎng)站根,通過域名訪問網(wǎng)站首頁比較頻繁,使用這個會加速處理,官網(wǎng)如是說。
這里是直接轉(zhuǎn)發(fā)給后端應(yīng)用服務(wù)器了,也可以是一個靜態(tài)首頁
第一個必選規(guī)則
location = / {
proxy_pass http://tomcat:8080/index
}
第二個必選規(guī)則是處理靜態(tài)文件請求,這是nginx作為http服務(wù)器的強(qiáng)項(xiàng)
有兩種配置模式,目錄匹配或后綴匹配,任選其一或搭配使用
location ^~ /static/ {
root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
第三個規(guī)則就是通用規(guī)則,用來轉(zhuǎn)發(fā)動態(tài)請求到后端應(yīng)用服務(wù)器
非靜態(tài)文件請求就默認(rèn)是動態(tài)請求,自己根據(jù)實(shí)際把握
畢竟目前的一些框架的流行,帶.php,.jsp后綴的情況很少了
location / {
proxy_pass http://tomcat:8080/
}
常用正則
- . : 匹配除換行符以外的任意字符
- ? : 重復(fù)0次或1次
- : 重復(fù)1次或更多次
- : 重復(fù)0次或更多次
- \d :匹配數(shù)字
- ^ : 匹配字符串的開始
- $ : 匹配字符串的介紹
- {n} : 重復(fù)n次
- {n,} : 重復(fù)n次或更多次
- [c] : 匹配單個字符c
- [a-z] : 匹配a-z小寫字母的任意一個