最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Nginx配置指令location匹配符優(yōu)先級和安全問題

 更新時(shí)間:2014年03月06日 11:27:12   作者:  
使用nginx 很久了,它的性能高,穩(wěn)定性表現(xiàn)也很好,得到了很多人的認(rèn)可。特別是它的配置,有點(diǎn)像寫程序一樣,每行命令結(jié)尾一個(gè)";"號,語句塊用"{}"括起來。 配制好,直接nginx -t 檢查配制情況,配制成功,直接運(yùn)行:service nginx reload .服務(wù)器沒有任何宕機(jī)情況下,實(shí)現(xiàn)平穩(wěn)修改配置

最近一直在做location 配置,遇到優(yōu)先級別問題(如果配置不當(dāng)可能存在安全隱患哦),以下是個(gè)人學(xué)習(xí)一點(diǎn)體會。

一、 location 的匹配符
1.等于匹配符:=
等于匹配符就是等號,特點(diǎn)可以概括為兩點(diǎn):
精確匹配
不支持正則表達(dá)式
2.空匹配符
空匹配符的特點(diǎn)是:
匹配以指定模式開始的 URI
不支持正則表達(dá)式
3.正則匹配符:~
正則匹配符是可以使用正則表達(dá)式的匹配符。不過這里要強(qiáng)調(diào)的是,一般來說~是指:
區(qū)分大小寫的正則匹配
而~*表示:
不區(qū)分大小寫的正則匹配
但是對于一些對大小寫不敏感的操作系統(tǒng),這兩者沒有區(qū)別。另外一個(gè)就是^~,其表示以指定模式開始的正則匹配。

4.內(nèi)部訪問符:@
一般用于錯(cuò)誤頁面等,這個(gè)暫不討論。

二、匹配符優(yōu)先級
1.=
2.空匹配符,滿足精確匹配時(shí)
3.^~
4.~或~*
5.空匹配符,滿足以指定模式開始時(shí)的匹配時(shí)
這樣說比較抽象,我們來看例子吧。

2.1 等于匹配符與精確匹配時(shí)的空匹配符

看下面的例子(用到我們此前一起完成的Hello World模塊):

復(fù)制代碼 代碼如下:

location /poechant {
    hello_world no1;
}

location = /poechant {
    hello_world no2;
}


如果我們的請求是http://my.domian/poechant,則我們發(fā)現(xiàn)兩個(gè)location都與請求的 URI 匹配,這時(shí)根據(jù)我們的優(yōu)先級順序,第一個(gè)是精確匹配時(shí)的空匹配符,第二個(gè)是等于匹配符,所以第二個(gè)的優(yōu)先級高,也就是應(yīng)該輸出:

hello_world, no2
同時(shí)也說明 Nginx 的 locatoin 不是按照配置文件中的書寫順序來匹配的。

2.2 精確匹配時(shí)的空匹配符與正則匹配的^~

下面這個(gè)例子中,兩者開始都精確匹配了,連這個(gè)正則匹配都是精確匹配。

復(fù)制代碼 代碼如下:

location ^~ ^/poechant$ {
    hello_world no1;
}

location /poechant {
    hello_world no2;
}


匹配哪一個(gè)?你測試一下,會得到:

hello_world, no2
與我們上面說的優(yōu)先級順序相吻合。
2.3 其他匹配優(yōu)先級比較的實(shí)例


三、實(shí)戰(zhàn)經(jīng)驗(yàn)總結(jié)

1.location 匹配的優(yōu)先級(來自實(shí)踐總結(jié)中)
(location =) > (location 完整路徑 >) >(location ^~ 路徑) >(location ~* 正則) >(location 路徑)
只要匹配到,其它的都會忽略,然后返回到改匹配。
用以下例子來測試:

復(fù)制代碼 代碼如下:

#1   
location / {
   return 500;
}
#2
location /a/ {
    return 404;
}
#3
location ~* \.jpg$ {
    return 403;
}
#4
location ^~ /a/ {
    return 402;
}
#5
location  /a/1.jpg {
    return 401;
}
#6
location = /a/1.jpg {
    return 400;
}

說明:測試的時(shí)候,先要將#2全部注釋掉,不然會認(rèn)為#2 與#4 完全一樣。會提示:重復(fù)配置,提示如下

復(fù)制代碼 代碼如下:

D:\nginx-0.8.7>nginx -s reload
[emerg]: duplicate location "/a/" in D:\nginx-0.8.7/conf/nginx.conf:53

瀏覽測試:每次都是訪問:http://localhost:9999/a/1.jpg (在windows 安裝測試,然后端口是9999) 文件a/1.jpg 根本不存在。關(guān)鍵是測試看頁面返回情況。

a.用上面的配置請求后的結(jié)果

復(fù)制代碼 代碼如下:
400 Bad Request
--------------------------------------------------------------------------------
nginx/0.8.7

從測試中可以看到,優(yōu)先級最高的是:= 號。 它會最先匹配到。
b.接下來我們 屏蔽掉 #6 如下:
復(fù)制代碼 代碼如下:
#6
#    location = /a/1.jpg {
#        return 400;
#    }

然后重載配置:D:\nginx-0.8.7> nginx -s reload  并訪問:http://localhost:9999/a/1.jpg ,返回以下結(jié)果:

復(fù)制代碼 代碼如下:

401 Authorization Required
--------------------------------------------------------------------------------
nginx/0.8.7

結(jié)論:從這個(gè)測試發(fā)現(xiàn),沒有“=”情況下,location 后面直接接完整路徑是優(yōu)先匹配。 通過測試發(fā)現(xiàn),如果將:location/a/1.jpg   改成:location /a/1\.jpg
會出現(xiàn)意外情況,直接出現(xiàn)是:return 402.  從這一點(diǎn),可以推測到nginx 匹配優(yōu)先是:網(wǎng)站路徑,并且不帶正則表達(dá)式的優(yōu)先。

c.同理測試 屏蔽掉 #5 如下:注釋及重新加載同上.
訪問:http://localhost:9999/a/1.jpg 返回如下結(jié)果。

復(fù)制代碼 代碼如下:

402 Payment Required
--------------------------------------------------------------------------------
nginx/0.8.7

結(jié)論:通過這個(gè)測試可以得出:location ^~ 優(yōu)先級 高于 location ~* 優(yōu)先級 ,其中:^~ 主要后面接路徑。

c.同理測試 屏蔽掉 #4 如下:注釋及重新加載同上.
訪問:http://localhost:9999/a/1.jpg 返回如下結(jié)果。

復(fù)制代碼 代碼如下:

403 Forbidden
--------------------------------------------------------------------------------
nginx/0.8.7

結(jié)論:從以上比較得到,正則優(yōu)先 未帶任何匹配符的路徑匹配

d.同理測試 屏蔽掉 #3 如下:注釋及重新加載同上. 并且去掉#2 的注釋“#”
訪問:http://localhost:9999/a/1.jpg 返回如下結(jié)果。

復(fù)制代碼 代碼如下:
404 Not Found
--------------------------------------------------------------------------------
nginx/0.8.7

結(jié)論:比較有意思是:/a/ 與 /  應(yīng)該是 同種類型的匹配表達(dá)式, 可以從中得到,該匹配順序是,將路徑從右匹配, 可以推測形如逐個(gè)字符,那個(gè)先匹配到,就是那個(gè)優(yōu)先。 因此得到是:/a/ 優(yōu)先于 / .


以上測試,是我測試結(jié)果,優(yōu)先級別以以上規(guī)律。 在實(shí)際我們書寫中,經(jīng)常會犯錯(cuò)誤。 還記得前段時(shí)間:80后安全團(tuán)隊(duì)曝nginx漏洞 其實(shí),個(gè)人認(rèn)為不能算是nginx 漏洞,只是,我們不了解nginx 配制規(guī)則,而出現(xiàn)一個(gè)配置上面致命漏洞而已。 其實(shí),通過上面優(yōu)先級,我們在配置時(shí)候可能也一樣經(jīng)常犯一個(gè)致命錯(cuò)誤。

復(fù)制代碼 代碼如下:

#以下是隨便寫例子,個(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 , 會直接顯示該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的。 覺得很安全,缺在不知不覺中被別人打開一扇門。

那么我們怎么樣修改呢?

復(fù)制代碼 代碼如下:

location ~* \.php$ {
    proxy_pass http://www.a.com;
}
location ^~ /upload/ {
    alias   /home/www/html/upload/;
}

對,就是必須用:"^~" ,這樣是不是就已經(jīng)安全了呢。 如果你再訪問下:http://www.a.com/upload/1.php  你會發(fā)現(xiàn),這段代碼源碼顯示出來了。 這個(gè)其實(shí)對于我們而言也是不想見到了。 一段顯示源碼,在各個(gè)搜索引擎,很容易通過所有特殊關(guān)鍵字,搜索到改文件的。
那么我們該怎么樣配置安全的上存目錄呢? 對,你想到了:限制允許的特殊文件類型。

復(fù)制代碼 代碼如下:

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ò)展名文件,就自動提示:403 不能訪問,有可以避免源代碼顯示。
剛才從匹配結(jié)果已經(jīng)知道了,同級不帶任何匹配符的,是以右為準(zhǔn)匹配。 那么,如果都用正則表達(dá)式,以什么方式匹配呢?
測試如下:(新建配置文件,server 包含)

復(fù)制代碼 代碼如下:

    location ~* \.jpg$ {
            return 402;
    }

    location ~* 1\.jpg$ {
            return 403;
    }

結(jié)果如下:

復(fù)制代碼 代碼如下:

402 Payment Required
--------------------------------------------------------------------------------
nginx/0.8.7

看來是返回的是:402 上面一個(gè)呢。 按理論說,1.jpg 配置 比 .jpg 更準(zhǔn)確,看來跟上面說的順序不同,那它會不會是那個(gè)在前以那個(gè)匹配呢? 我們再測試下:

復(fù)制代碼 代碼如下:

location ~* 1\.jpg$ {
            return 403;
    }

    location ~* \.jpg$ {
            return 402;
    }

返回結(jié)果是:

復(fù)制代碼 代碼如下:

403 Forbidden
--------------------------------------------------------------------------------
nginx/0.8.7

哈哈,恰好相反,看來我的推斷是正確的,如果都是正則,都能夠匹配,以配置文件出現(xiàn)順序來,誰在前誰優(yōu)先。 一口氣說了,不知道朋友你,明白我的思路嗎?這樣的比較會很多很多,大家可以逐一測試。 熟悉location 配置,對于熟練運(yùn)用nginx 是一個(gè)必備基礎(chǔ)。 因?yàn)閚ginx 太靈活,也太流行了。上面的問題,也許朋友你,會遇到。希望對你有幫助。

相關(guān)文章

  • Nginx啟動成功卻無法訪問網(wǎng)頁的問題分析和解決方案(完整的排除方案)

    Nginx啟動成功卻無法訪問網(wǎng)頁的問題分析和解決方案(完整的排除方案)

    我是用的阿里云的服務(wù)器,所以我的問題就在于阿里云服務(wù)器必須單獨(dú)開端口,在找到這個(gè)問題之前,我已經(jīng)把所有能試的方法試過了一遍都沒有問題,在增加端口之后直接成功了,如果你也遇到了這樣的問題,就和我一起排除吧
    2023-12-12
  • nginx開啟HSTS讓瀏覽器強(qiáng)制跳轉(zhuǎn)HTTPS訪問詳解

    nginx開啟HSTS讓瀏覽器強(qiáng)制跳轉(zhuǎn)HTTPS訪問詳解

    這篇文章主要介紹了nginx開啟HSTS讓瀏覽器強(qiáng)制跳轉(zhuǎn)HTTPS訪問詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-05-05
  • 一段萬能的nginx接口實(shí)現(xiàn)反向代理配置

    一段萬能的nginx接口實(shí)現(xiàn)反向代理配置

    這篇文章主要介紹了一段萬能的nginx接口實(shí)現(xiàn)反向代理配置,詳細(xì)的介紹了什么是反向代理及其接口反向代理的實(shí)現(xiàn),非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2018-10-10
  • 使用nginx方式實(shí)現(xiàn)http轉(zhuǎn)換為https的示例代碼

    使用nginx方式實(shí)現(xiàn)http轉(zhuǎn)換為https的示例代碼

    這篇文章主要介紹了使用nginx方式實(shí)現(xiàn)http轉(zhuǎn)換為https的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Nginx安裝nginx-rtmp-module模塊的實(shí)現(xiàn)

    Nginx安裝nginx-rtmp-module模塊的實(shí)現(xiàn)

    nginx-rtmp-module是一個(gè)用于Nginx的第三方模塊,它使Nginx能夠支持實(shí)時(shí)多媒體流的傳輸和處理,本文主要介紹了Nginx安裝nginx-rtmp-module模塊,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-02-02
  • 如何配置nginx成功代理websocket

    如何配置nginx成功代理websocket

    配置Nginx作為WebSocket代理是一種常見的設(shè)置,以便在Nginx服務(wù)器上實(shí)現(xiàn)WebSocket連接的轉(zhuǎn)發(fā)和負(fù)載均衡,這篇文章主要介紹了配置nginx以成功代理websocket,需要的朋友可以參考下
    2024-02-02
  • nginx將https協(xié)議反向代理到http協(xié)議請求上的實(shí)現(xiàn)

    nginx將https協(xié)議反向代理到http協(xié)議請求上的實(shí)現(xiàn)

    本文主要介紹了nginx將https協(xié)議反向代理到http協(xié)議請求上的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-10-10
  • 詳解Nginx SSL快速雙向認(rèn)證配置(腳本)

    詳解Nginx SSL快速雙向認(rèn)證配置(腳本)

    這篇文章主要介紹了詳解Nginx SSL快速雙向認(rèn)證配置(腳本),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • 使用nginx配置訪問wgcloud的方法

    使用nginx配置訪問wgcloud的方法

    這篇文章主要介紹了使用nginx配置訪問wgcloud的方法,在這里大家需要記得agent的配置文件項(xiàng)serverUrl的80端口也要寫上,需要的朋友可以參考下
    2021-06-06
  • nginx訪問控制的實(shí)現(xiàn)示例

    nginx訪問控制的實(shí)現(xiàn)示例

    這篇文章主要介紹了nginx訪問控制的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11

最新評論

故城县| 金门县| 磴口县| 丰原市| 犍为县| 策勒县| 杭州市| 公安县| 泸水县| 东乡| 鹤壁市| 隆子县| 武川县| 忻州市| 平遥县| 离岛区| 邯郸县| 文化| 固阳县| 伊宁县| 礼泉县| 衡东县| 舞钢市| 宣恩县| 秭归县| 肥乡县| 平罗县| 蕉岭县| 宁都县| 朔州市| 仁怀市| 青岛市| 安图县| 龙陵县| 南城县| 阜宁县| 镇巴县| 武义县| 鹤岗市| 木里| 高邮市|