nginx 正则 结尾 配置_nginx location 配置阐述优先级别使用说明-不当可能存在安全隐患...
使用nginx 有好幾年了,它的高性能,穩(wěn)定性表現(xiàn)都很好。 這里也得到很多人的認(rèn)可。 其中它的配置,有點(diǎn)像寫程序一樣,每行命令結(jié)尾一個(gè)";"號(hào),語句塊用"{}"括起來。 配制好,直接nginx -t 檢查配制情況,配制成功,直接運(yùn)行:service nginx reload .服務(wù)器沒有任何宕機(jī)情況下,實(shí)現(xiàn)平穩(wěn)修改配置。
最近一直在做location 配制時(shí)候,遇到小麻煩,以下是個(gè)人學(xué)習(xí)一點(diǎn)體會(huì)。
1.location 匹配的優(yōu)先級(jí)(來自實(shí)踐總結(jié)中)
(location =) > (location 完整路徑 >) >(location ^~ 路徑) >(location ~* 正則) >(location 路徑)
只要匹配到,其它的都會(huì)忽略,然后返回到改匹配。
用以下例子來測(cè)試:
#1 6 location / { 7 return 500; 8 } 9 10 #211 location /a/ {12 return 404;13 }14 15 #316 location ~* .jpg$ {17 return 403;18 }19 20 #421 location ^~ /a/ {22 return 402;23 }24 25 #526 location /a/1.jpg {27 return 401;28 }29 30 #631 location = /a/1.jpg {32 return 400;33 }34說明測(cè)試時(shí)候:先要將#2全部注釋掉,不然會(huì)認(rèn)為#2 與#4 完全一樣。會(huì)提示:重復(fù)配制
D:ginx-0.8.7>nginx -s reload[emerg]: duplicate location "/a/" in D:ginx-0.8.7/conf/nginx.conf:53首先測(cè)試:每次都是訪問:http://localhost:9999/a/1.jpg (在windows 安裝測(cè)試,然后端口是9999) 文件a/1.jpg 根本不存在。關(guān)鍵是測(cè)試看頁(yè)面返回情況。
a.
400 Bad Request--------------------------------------------------------------------------------nginx/0.8.7(圖一)
從測(cè)試中可以看到,優(yōu)先級(jí)最高的是:= 號(hào)。 它會(huì)最先匹配到。
b.接下來我們 屏蔽掉 #6 如下:
#6# location = /a/1.jpg {# return 400;# }然后在:D:ginx-0.8.7> nginx -s reload 訪問:http://localhost:9999/a/1.jpg
401 Authorization Required--------------------------------------------------------------------------------nginx/0.8.7圖(2-2)
注意:從這個(gè)測(cè)試 發(fā)現(xiàn) :沒有“=”情況下,location 后面直接接完整路徑是優(yōu)先匹配。 通過測(cè)試發(fā)現(xiàn),如果將:location /a/1.jpg 改成:location /a/1.jpg
會(huì)出現(xiàn)意外情況,直接出現(xiàn)是:return 402. 從這一點(diǎn),可以推測(cè)到nginx 匹配優(yōu)先是:網(wǎng)站路徑,并且不帶正則表達(dá)式的優(yōu)先。
以上是本人通過測(cè)試,推測(cè)得到,如有問題,歡迎指正。
c.同理測(cè)試 屏蔽掉 #5 如下:注釋及重新加載同上.
#5# location /a/1.jpg {# return 401;# }訪問:http://localhost:9999/a/1.jpg 返回如下結(jié)果。
402 Payment Required--------------------------------------------------------------------------------nginx/0.8.7通過這個(gè)測(cè)試可以得出:location ^~ 優(yōu)先級(jí) 高于 location ~* 優(yōu)先級(jí) ,其中:^~ 主要后面接路徑。
c.同理測(cè)試 屏蔽掉 #4 如下:注釋及重新加載同上.
#4# location ^~ /a/ {# return 402;# } 訪問:http://localhost:9999/a/1.jpg 返回如下結(jié)果。403 Forbidden--------------------------------------------------------------------------------nginx/0.8.7從以上比較得到:正則優(yōu)先 未帶任何批評(píng)符 的路徑匹配
d.同理測(cè)試 屏蔽掉 #3 如下:注釋及重新加載同上. 并且去掉#2 的注釋“#”
#2 location /a/ { return 404; } 訪問:http://localhost:9999/a/1.jpg 返回如下結(jié)果。404 Not Found--------------------------------------------------------------------------------nginx/0.8.7比較有意思是:/a/ 與 / 應(yīng)該是 同種類型的匹配表達(dá)式, 可以從中得到,該匹配順序是,將路徑從右匹配, 可以推測(cè)形如逐個(gè)字符,那個(gè)先匹配到,就是那個(gè)優(yōu)先。 因此得到是:/a/ 優(yōu)先于 / .
以上測(cè)試,是我測(cè)試結(jié)果,優(yōu)先級(jí)別以以上規(guī)律。 在實(shí)際我們書寫中,經(jīng)常會(huì)犯錯(cuò)誤。 還記得前段時(shí)間:80后安全團(tuán)隊(duì)曝nginx漏洞 其實(shí),個(gè)人認(rèn)為不能算是nginx 漏洞,只是,我們不了解nginx 配制規(guī)則,而出現(xiàn)一個(gè)配置上面致命漏洞而已。 其實(shí),通過上面優(yōu)先級(jí),我們?cè)谂渲脮r(shí)候可能也一樣經(jīng)常犯一個(gè)致命錯(cuò)誤。
#以下是隨便寫例子,個(gè)人可能各不相同#假設(shè)站點(diǎn)在:/home/www/html/目錄下,所有的php 及上傳文件都在這個(gè)目錄下面。location ~* .php$ { proxy_pass http://www.a.com; }location /upload/ { alias /home/www/html/upload/;}而且,這個(gè)upload 目錄,是靜態(tài)目錄,我們想法是下面所有文件是不能夠執(zhí)行的,包括php文件。
如果有用戶訪問:http://www.a.com/upload/1.css , 會(huì)直接顯示該css, 但是,如果有用戶訪問:http://www.a.com/upload/1.php 類似文件,正如上面所說,實(shí)際匹配到:~* .php$ 了。 upload 下面是執(zhí)行了。
從這個(gè)里面,我們發(fā)現(xiàn)一個(gè)問題,實(shí)際沒有達(dá)到我們要求。 靜態(tài)目錄下面的文件一樣執(zhí)行了。 這下比較麻煩了。 一旦出現(xiàn)個(gè)什么上存漏洞的,別人上存了一個(gè)php,我們還以為,我們配置是ok的。 覺得很安全,缺在不知不覺中被別人打開一扇門。
那么我們?cè)趺礃有薷哪?#xff1f;
location ~* .php$ { proxy_pass http://www.a.com; }location ^~ /upload/ { alias /home/www/html/upload/;}對(duì),就是必須用:"^~" ,這樣是不是就已經(jīng)安全了呢。 如果你再訪問下:http://www.a.com/upload/1.php 你會(huì)發(fā)現(xiàn),這段代碼源碼顯示出來了。 這個(gè)其實(shí)對(duì)于我們而言也是不想見到了。 一段顯示源碼,在各個(gè)搜索引擎,很容易通過所有特殊關(guān)鍵字,搜索到改文件的。
那么我們?cè)撛趺礃优渲冒踩纳洗婺夸浤?#xff1f; 對(duì),你想到了:限制允許的特殊文件類型。
改造如下:
location ~* .php$ { proxy_pass http://www.a.com; }location ^~ /upload/ { if ($request_filename ! ~* .(jpg|jpeg|gif|png|swf|zip|rar|txt)$) { return 403; } alias /home/www/html/upload/;}只要不是滿足上面擴(kuò)展名文件,就自動(dòng)提示:403 不能訪問,有可以避免源代碼顯示。
剛才從匹配結(jié)果已經(jīng)知道了,同級(jí)不帶任何匹配符的,是以右為準(zhǔn)匹配。 那么,如果都用正則表達(dá)式,以什么方式匹配呢?
測(cè)試如下:(新建配置文件,server 包含)
location ~* .jpg$ { return 402; } location ~* 1.jpg$ { return 403; }結(jié)果如下:
402 Payment Required--------------------------------------------------------------------------------nginx/0.8.7看來是返回的是:402 上面一個(gè)呢。 按理論說,1.jpg 配置 比 .jpg 更準(zhǔn)確,看來跟上面說的順序不同,那它會(huì)不會(huì)是那個(gè)在前以那個(gè)匹配呢? 我們?cè)贉y(cè)試下:
location ~* 1.jpg$ { return 403; } location ~* .jpg$ { return 402; }返回結(jié)果是:
403 Forbidden--------------------------------------------------------------------------------nginx/0.8.7哈哈,恰好相反,看來我的推斷是正確的,如果都是正則,都能夠匹配,以配置文件出現(xiàn)順序來,誰在前誰優(yōu)先。 一氣說了,不知道朋友你,明白我的思路嗎?這樣比較會(huì)很多很多,大家可以逐一測(cè)試。 熟悉location 配置,對(duì)于熟練運(yùn)用,nginx 是一個(gè)必備基數(shù)。 因?yàn)?#xff0c;nginx 太靈活,也太流行了。上面的問題,也許朋友你,會(huì)遇到。希望對(duì)你有幫助。
總結(jié)
以上是生活随笔為你收集整理的nginx 正则 结尾 配置_nginx location 配置阐述优先级别使用说明-不当可能存在安全隐患...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 函数重载_在Python中
- 下一篇: nginx配置websocket_Ing