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