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