十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
nginx 在收到一條請求時將先通過 server_name 匹配一個 server, 然后使用 server 中的 location 繼續(xù)匹配.
創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站制作、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的屯留網(wǎng)站設(shè)計(jì)、移動媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
匹配 server_name
在 nginx 中, server_name 決定了當(dāng)收到一個請求后哪一個 server 會被使用. nginx 會使用請求頭中的 Host 字段與 server_name 進(jìn)行匹配. 定義 server_name 時可以使用 完全名稱、通配符名稱、正則表達(dá)式名稱, 它們的匹配順序如下:
如果沒有匹配到結(jié)果, 將會使用 default_server 進(jìn)行處理, 如果沒有定義, 則第一個定義的為 default_server. 使用三個簡單的 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ù)器為 第一個, 隨便訪問一個不存在的 server 將會返回 401. 不過可以使用 default_server 手動設(shè)置一個默認(rèn)主機(jī), default_server 設(shè)置在 listen 字段, 如下:
server { listen 80 default_server; server_name example.net www.example.net; }
之后再匹配時, 未匹配到將會使用這個 server.
禁止訪問
如果想要禁止一個沒有攜帶 Host 字段的請求, 可以定義如下 server:
server { listen 80; server_name ""; return 444; }
server_name 定義為空字符串, 如果 Host 字段為空或不存在, 將會匹配到這個 server, 然后返回 404 狀態(tài)碼.
Nginx 的444 狀態(tài)比較特殊,如果返回 444 那么客戶端將不會收到服務(wù)端返回的信息,就像是網(wǎng)站無法連接一樣, 瀏覽器直接顯示 502. 但是如果使用反向代理, 還是顯示正常狀態(tài)碼
如果想要禁止訪問不存在的主機(jī), 可以這樣定義:
server { listen 80 default_server; server_name _; return 444; }
_ 在這里沒有任何特別含義, 因?yàn)橐粋€域名中不會出現(xiàn) _, 所以不會與任何真實(shí)的域名相同, 使用其他非法字符是相同的道理.
同時匹配 IP 和 server_name
現(xiàn)在來看一下對于監(jiān)聽不同 IP 和不同 server_name 混合使用時是如何處理的:
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; }
在這個配置中, nginx 首先匹配 IP, 匹配到后再匹配它們的 server_name, 如果沒有匹配到 server_name, 則使用到它們默認(rèn)的 server. 舉個例子, 如果一個域名為 www.example.com 的請求來自 192.168.1.1:80. 但是監(jiān)聽 192.168.1.1:80 的 server 只有兩個, 這兩個都不能匹配 www.example.com, 那么就使用這兩個 server 中的默認(rèn)主機(jī), 由于沒有使用 defualt_server 定義監(jiān)聽, 所以默認(rèn)為第一個即 www.example.org 這個 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 匹配到一個 server 后, 就會通過 location 繼續(xù)處理請求, 下面是一個示例:
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 首先會在所有的 location 中搜索 前綴進(jìn)行匹配, 匹配到前綴后, 將按順序匹配使用 正則表達(dá)式 定義的 location, 匹配到就結(jié)束, 如果沒有匹配到, 則使用之前匹配到前綴的那個 location 進(jìn)行處理, 下面是具體匹配的例子:
參考
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對創(chuàng)新互聯(lián)的支持。