Nginx處理請(qǐng)求時(shí)的匹配規(guī)則詳析
nginx 在收到一條請(qǐng)求時(shí)將先通過 server_name 匹配一個(gè) server, 然后使用 server 中的 location 繼續(xù)匹配.
匹配 server_name
在 nginx 中, server_name 決定了當(dāng)收到一個(gè)請(qǐng)求后哪一個(gè) server 會(huì)被使用. nginx 會(huì)使用請(qǐng)求頭中的 Host 字段與 server_name 進(jìn)行匹配. 定義 server_name 時(shí)可以使用 完全名稱、通配符名稱、正則表達(dá)式名稱, 它們的匹配順序如下:
- 完全匹配
- 前通配符匹配, 即 *.example.org
- 后通配符匹配, 即 mail.*
- 正則表達(dá)式匹配
如果沒有匹配到結(jié)果, 將會(huì)使用 default_server 進(jìn)行處理, 如果沒有定義, 則第一個(gè)定義的為 default_server. 使用三個(gè)簡(jiǎn)單的 server 作為例子, 讓他們監(jiān)聽 80 端口, server_name 分別設(shè)置為 *.org、*.net、*.com:
server {
listen 80;
server_name example.org www.example.org;
return 401;
}
server {
listen 80;
server_name example.net www.example.net;
return 402;
}
server {
listen 80;
server_name example.com www.example.com;
return 403;
}
在上面的配置中, 默認(rèn)的服務(wù)器為 第一個(gè), 隨便訪問一個(gè)不存在的 server 將會(huì)返回 401. 不過可以使用 default_server 手動(dòng)設(shè)置一個(gè)默認(rèn)主機(jī), default_server 設(shè)置在 listen 字段, 如下:
server {
listen 80 default_server;
server_name example.net www.example.net;
}
之后再匹配時(shí), 未匹配到將會(huì)使用這個(gè) server.
禁止訪問
如果想要禁止一個(gè)沒有攜帶 Host 字段的請(qǐng)求, 可以定義如下 server:
server {
listen 80;
server_name "";
return 444;
}
server_name 定義為空字符串, 如果 Host 字段為空或不存在, 將會(huì)匹配到這個(gè) server, 然后返回 404 狀態(tài)碼.
Nginx 的444 狀態(tài)比較特殊,如果返回 444 那么客戶端將不會(huì)收到服務(wù)端返回的信息,就像是網(wǎng)站無法連接一樣, 瀏覽器直接顯示 502. 但是如果使用反向代理, 還是顯示正常狀態(tài)碼
如果想要禁止訪問不存在的主機(jī), 可以這樣定義:
server {
listen 80 default_server;
server_name _;
return 444;
}
_ 在這里沒有任何特別含義, 因?yàn)橐粋€(gè)域名中不會(huì)出現(xiàn) _, 所以不會(huì)與任何真實(shí)的域名相同, 使用其他非法字符是相同的道理.
同時(shí)匹配 IP 和 server_name
現(xiàn)在來看一下對(duì)于監(jiān)聽不同 IP 和不同 server_name 混合使用時(shí)是如何處理的:
server {
listen 192.168.1.1:80;
server_name example.org www.example.org;
}
server {
listen 192.168.1.1:80;
server_name example.net www.example.net;
}
server {
listen 192.168.1.2:80;
server_name example.com www.example.com;
}
在這個(gè)配置中, nginx 首先匹配 IP, 匹配到后再匹配它們的 server_name, 如果沒有匹配到 server_name, 則使用到它們默認(rèn)的 server. 舉個(gè)例子, 如果一個(gè)域名為 www.example.com 的請(qǐng)求來自 192.168.1.1:80. 但是監(jiān)聽 192.168.1.1:80 的 server 只有兩個(gè), 這兩個(gè)都不能匹配 www.example.com, 那么就使用這兩個(gè) server 中的默認(rèn)主機(jī), 由于沒有使用 defualt_server 定義監(jiān)聽, 所以默認(rèn)為第一個(gè)即 www.example.org 這個(gè) server. 當(dāng)然你可以定義 defualt_server:
server {
listen 192.168.1.1:80;
server_name example.org www.example.org;
}
server {
listen 192.168.1.1:80 default_server;
server_name example.net www.example.net;
}
server {
listen 192.168.1.2:80 default_server;
server_name example.com www.example.com;
}
匹配 location
在 nginx 匹配到一個(gè) server 后, 就會(huì)通過 location 繼續(xù)處理請(qǐng)求, 下面是一個(gè)示例:
server {
listen 172.17.0.3:80;
server_name _;
location / {
return 401;
}
location ~*\.(gif|jpg|png)$ {
return 402;
}
location ~*\.(gif|jpg|png)$ {
return 404;
}
location /api {
return 403;
}
}
nginx 首先會(huì)在所有的 location 中搜索 前綴進(jìn)行匹配, 匹配到前綴后, 將按順序匹配使用 正則表達(dá)式 定義的 location, 匹配到就結(jié)束, 如果沒有匹配到, 則使用之前匹配到前綴的那個(gè) location 進(jìn)行處理, 下面是具體匹配的例子:
- 一個(gè) /x.gif 請(qǐng)求, 首先匹配到的前綴為 /, 然后使用剩下的 x.gif 跟 location 的正則去匹配, 先匹配到了 location ~*\.(gif|jpg|png)$, 返回 402.
- 一個(gè) /x.pdf 請(qǐng)求, 由于 x.pdf 無法被匹配到, 所以使用 location / 進(jìn)行處理.
- 一個(gè) /api/x.gif, 首先匹配到前綴為 /api, 然后使用剩下的 x.gif 跟 location 的正則去匹配, 先匹配到了 location ~*\.(gif|jpg|png)$, 返回 402.
- 一個(gè) /api/x.pdf 請(qǐng)求, 由于 x.pdf 無法被匹配到, 所以使用 location /api 進(jìn)行處理.
參考
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Nginx服務(wù)器中l(wèi)ocation配置的一些基本要點(diǎn)解析
這篇文章主要介紹了Nginx服務(wù)器中l(wèi)ocation配置的一些基本要點(diǎn)解析,特別對(duì)管理以及查找匹配作出了詳細(xì)的講解,需要的朋友可以參考下2015-12-12
nginx運(yùn)行報(bào)錯(cuò):unknown directive “stream“的解決方案
這篇文章主要給大家介紹了nginx 運(yùn)行報(bào)錯(cuò):unknown directive "stream"的原因,主要是因?yàn)闆]有安裝stream模塊導(dǎo)致的,我們只需要編譯安裝一下stream模塊即可解決這個(gè)問題,文中有詳細(xì)的解決方案,需要的朋友可以參考下2023-09-09
Nginx通過nginx-rtmp-module模塊搭建流媒體服務(wù)器實(shí)現(xiàn)直播
近日有客戶咨詢想用Nginx搭建流媒體服務(wù)器實(shí)現(xiàn)直播,方便他們打造自己的平臺(tái),經(jīng)過各種測(cè)試發(fā)現(xiàn)如下文章不錯(cuò),特分享給需要的朋友2023-10-10
Debian系統(tǒng)下為PHP程序配置Nginx服務(wù)器的基本教程
這篇文章主要介紹了Debian系統(tǒng)下為PHP程序配置Nginx服務(wù)器的基本教程,這里使用到了FastCGI和php-fpm,需要的朋友可以參考下2015-12-12
通過nginx反向代理來調(diào)試代碼的實(shí)現(xiàn)
這篇文章主要介紹了通過nginx反向代理來調(diào)試代碼的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01

