Nginx?Location映射規(guī)則總結(jié)歸納與最佳實(shí)踐
Nginx的location
指令是配置請(qǐng)求路由的核心機(jī)制,其匹配規(guī)則直接影響請(qǐng)求的處理流程。下面基于官方文檔和實(shí)戰(zhàn)經(jīng)驗(yàn)的總結(jié):
一、Location匹配規(guī)則與優(yōu)先級(jí)
1. 匹配模式
Nginx支持5種location
修飾符,優(yōu)先級(jí)從高到低為:
修飾符 | 說(shuō)明 | 示例 |
---|---|---|
= | 精確匹配(最高優(yōu)先級(jí)) | location = /logo.png |
^~ | 最長(zhǎng)前綴匹配(匹配后停止正則檢查) | location ^~ /static/ |
~ | 正則匹配(區(qū)分大小寫(xiě),按配置文件順序匹配) | location ~ \.php$ |
~* | 正則匹配(不區(qū)分大小寫(xiě)) | `location ~* .(jpg |
無(wú) | 普通前綴匹配(按最長(zhǎng)匹配原則,優(yōu)先級(jí)最低) | location /blog/ |
2. 優(yōu)先級(jí)順序
Nginx按以下順序匹配location
塊:
精確匹配(=
)
僅當(dāng)請(qǐng)求URI與location
后的字符串完全匹配時(shí)生效。正則匹配(~
/~*
)
按配置文件中的書(shū)寫(xiě)順序依次匹配,首個(gè)匹配的正則生效。最長(zhǎng)前綴匹配(^~
)
選擇匹配URI前綴最長(zhǎng)的location
塊。普通前綴匹配
按最長(zhǎng)匹配原則選擇,若多個(gè)location
匹配,選擇最先定義的。默認(rèn)匹配(location /
)
兜底處理未匹配其他規(guī)則的請(qǐng)求。
3. 匹配示例
假設(shè)配置如下:
location = /exact { ... } # 精確匹配 location ^~ /prefix { ... } # 最長(zhǎng)前綴匹配 location ~ \.png$ { ... } # 正則匹配(區(qū)分大小寫(xiě)) location /general { ... } # 普通前綴匹配 location / { ... } # 默認(rèn)匹配
- 請(qǐng)求
/exact
→ 匹配location = /exact
。 - 請(qǐng)求
/prefix/long
→ 匹配location ^~ /prefix
(^~
優(yōu)先級(jí)高于普通前綴)。 - 請(qǐng)求
/image.PNG
→ 匹配location ~* \.(jpg|png)$
(不區(qū)分大小寫(xiě)的正則)。 - 請(qǐng)求
/general/path
→ 匹配location /general
。
二、Proxy_pass路徑處理規(guī)則
proxy_pass
指令用于將請(qǐng)求轉(zhuǎn)發(fā)到后端服務(wù),其路徑拼接邏輯與location
配置緊密相關(guān)。
1. 路徑拼接規(guī)則
場(chǎng)景 | 示例配置 | 請(qǐng)求URI | 轉(zhuǎn)發(fā)目標(biāo) |
---|---|---|---|
proxy_pass 帶/ 結(jié)尾 | location /api/ { proxy_pass http://backend/; } | /api/user | http://backend/user |
proxy_pass 不帶/ | location /api { proxy_pass http://backend; } | /api/user | http://backend/api/user |
正則location | location ~ ^/app/(.*) { proxy_pass http://app/$1; } | /app/v1/data | http://app/v1/data |
關(guān)鍵規(guī)則:
- 帶
/
:proxy_pass
的URL以/
結(jié)尾時(shí),替換location
匹配的部分。 - 不帶
/
:proxy_pass
的URL不帶/
時(shí),追加location
匹配后的完整路徑。
2. 路徑截取與重寫(xiě)
通過(guò)rewrite
指令可動(dòng)態(tài)修改轉(zhuǎn)發(fā)路徑:
location ~* ^/api/v1/ { rewrite ^/api/v1/(.*) /$1 break; # 截取/api/v1/后的路徑 proxy_pass http://backend; }
請(qǐng)求/api/v1/user/123
→ 轉(zhuǎn)發(fā)到http://backend/user/123
。
3. 特殊場(chǎng)景處理
Unix Socket轉(zhuǎn)發(fā):
location /unix/ { proxy_pass http://unix:/var/run/backend.sock:/; }
避免301重定向:
location /app { proxy_pass http://backend; } # 請(qǐng)求/app(無(wú)結(jié)尾/)時(shí),Nginx可能自動(dòng)重定向到/app/ # 使用精確匹配避免: location = /app { proxy_pass http://backend; }
三、配置優(yōu)化與最佳實(shí)踐
精確匹配優(yōu)先
將location =
塊置于配置文件頂部,減少正則匹配開(kāi)銷(xiāo)。
正則匹配順序
將高頻請(qǐng)求的正則規(guī)則前置,提升匹配效率。
路徑設(shè)計(jì)一致性
確保location
和proxy_pass
的URL格式(是否帶/
)一致,避免路徑拼接錯(cuò)誤。
監(jiān)控
使用error_log
和access_log
跟蹤匹配過(guò)程,優(yōu)化配置。
四、完整配置示例
server { listen 80; server_name example.com; # 精確匹配靜態(tài)文件 location = /favicon.ico { log_not_found off; access_log off; root /var/www/icons; } # 最長(zhǎng)前綴匹配API請(qǐng)求 location ^~ /api/ { proxy_pass http://api_server; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # 正則匹配圖片資源(不區(qū)分大小寫(xiě)) location ~* \.(jpg|png|gif)$ { expires 30d; root /var/www/images; } # 默認(rèn)匹配 location / { root /var/www/html; index index.html; } }
配置說(shuō)明:
- 精確匹配
favicon.ico
,關(guān)閉日志提升性能。 ^~ /api/
匹配所有以/api/
開(kāi)頭的請(qǐng)求,轉(zhuǎn)發(fā)到后端服務(wù)。- 正則匹配圖片文件,設(shè)置30天緩存。
- 未匹配的請(qǐng)求由
location /
處理,返回靜態(tài)文件。
到此這篇關(guān)于Nginx Location映射規(guī)則總結(jié)歸納的文章就介紹到這了,更多相關(guān)Nginx Location映射規(guī)則內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx負(fù)載均衡下的webshell連接的實(shí)現(xiàn)
在解決shell文件上傳問(wèn)題、命令執(zhí)行漂移等困難后,可實(shí)現(xiàn)正常的webshell上傳,本文主要介紹了Nginx負(fù)載均衡下的webshell連接的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01Nginx強(qiáng)制跳轉(zhuǎn)Https(Http訪問(wèn)跳轉(zhuǎn)Https)
這篇文章主要為大家介紹了Http訪問(wèn)強(qiáng)制跳轉(zhuǎn)到Https的幾種方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10Nginx服務(wù)器中配置GeoIP模塊來(lái)攔截指定國(guó)家IP
Nginx中自帶GeoIP模塊可以屏蔽指定IP的請(qǐng)求,只不過(guò)默認(rèn)沒(méi)有被編譯,打開(kāi)以后我們只要再下載一個(gè)IP規(guī)則就行,Nginx服務(wù)器中配置GeoIP模塊來(lái)攔截指定國(guó)家IP2016-06-06nginx重寫(xiě)rewrite基礎(chǔ)及實(shí)例分享
這篇文章主要介紹了nginx重寫(xiě)rewrite基礎(chǔ)及實(shí)例分享,需要的朋友可以參考下2016-04-04Nginx基礎(chǔ)配置(main、events、http、server、location)
本文主要介紹了Nginx基礎(chǔ)配置(main、events、http、server、location),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06關(guān)于nginx 實(shí)現(xiàn)jira反向代理的問(wèn)題
這篇文章主要介紹了關(guān)于nginx 實(shí)現(xiàn)jira反向代理的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09nginx反向代理https內(nèi)部定向到http報(bào)302的問(wèn)題及解決
這篇文章主要介紹了nginx反向代理https內(nèi)部定向到http報(bào)302的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12Nginx 獲取客戶端真實(shí)IP $remote_addr與X-Forwarded-For的實(shí)現(xiàn)
我們大多數(shù)情況下訪問(wèn)服務(wù)時(shí),客戶端并不是直接訪問(wèn)到服務(wù)器的,本文主要介紹了Nginx 獲取客戶端真實(shí)IP $remote_addr與X-Forwarded-For的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03