Nginx內(nèi)置變量應(yīng)用場景分析
Nginx 的內(nèi)置變量是其配置靈活性的核心,它們提供了豐富的客戶端請求和服務(wù)器狀態(tài)信息。下述表格匯總了這些變量,并附帶了實(shí)用的分類和說明,方便快速查閱和使用。
1. Nginx 內(nèi)置變量速查表
變量類別 | 變量名 | 說明與示例 |
|---|---|---|
請求URI與參數(shù)? |
| 當(dāng)前請求的URI(不含參數(shù)),可能經(jīng)過內(nèi)部重寫。例: |
| 客戶端原始的完整請求URI(含參數(shù))。例: | |
| 請求行中的參數(shù)字符串。例: | |
| 獲取指定名稱的參數(shù)值。例: | |
| 如果請求有參數(shù),值為 | |
客戶端信息? |
| 客戶端的直接IP地址 |
| 透傳客戶端原始IP的請求頭,常用于識別經(jīng)過代理的真實(shí)用戶IP | |
| 客戶端瀏覽器標(biāo)識 | |
| 請求來源頁面 | |
請求內(nèi)容? |
| HTTP 請求方法,如 |
| 請求頭中的 | |
| 請求頭中的 | |
| 客戶端的請求主體內(nèi)容 | |
服務(wù)器信息? |
| 請求的主機(jī)名,優(yōu)先級:請求行 > "Host"請求頭 > 匹配的服務(wù)器名 |
| 當(dāng)前匹配的服務(wù)器塊名稱 | |
| 請求到達(dá)的服務(wù)器端口 | |
| 請求協(xié)議, | |
| 若為SSL安全模式,值為 | |
文件路徑? |
| 當(dāng)前請求的文檔根目錄或別名 |
| 當(dāng)前請求映射到的本地文件系統(tǒng)路徑 | |
響應(yīng)與性能? |
| HTTP 響應(yīng)狀態(tài)碼 |
| 發(fā)送給客戶端的響應(yīng)體字節(jié)數(shù)(不含頭) | |
| 處理請求所耗費(fèi)的時(shí)間 | |
其他常用變量? |
| 獲取指定名稱的 Cookie 值 |
| 獲取任意請求頭字段,將 | |
| Nginx 版本號 | |
| 服務(wù)器時(shí)間的 ISO 8601 格式 |
2. 核心變量詳解與應(yīng)用場景
了解這些變量的典型用法,能幫助你更好地配置Nginx。
- 精確控制:
$uri 與$request_uri$uri反映的是當(dāng)前請求經(jīng)過Nginx內(nèi)部處理(如重寫規(guī)則)后的URI,不帶參數(shù)。它常用于內(nèi)部重定向或作為其他指令的輸入。$request_uri則是客戶端發(fā)來的原始請求,包含所有參數(shù),且是只讀的。在構(gòu)建反向代理請求時(shí),如果你希望原封不動(dòng)地將客戶端請求傳遞給后端,通常會(huì)使用$request_uri。
- 獲取客戶端真實(shí)IP:
$remote_addr與$http_x_forwarded_for- 當(dāng)客戶端與Nginx服務(wù)器之間沒有代理時(shí),
$remote_addr就是客戶端的真實(shí)IP。 - 當(dāng)存在反向代理(如CDN、負(fù)載均衡器)時(shí),
$remote_addr會(huì)是最后一個(gè)代理服務(wù)器的IP。此時(shí),代理服務(wù)器通常會(huì)將客戶端的原始IP放在X-Forwarded-For請求頭中,這個(gè)值可以通過$http_x_forwarded_for變量獲取 。處理多級代理時(shí),這個(gè)變量可能包含一個(gè)IP列表。
- 當(dāng)客戶端與Nginx服務(wù)器之間沒有代理時(shí),
- 靈活獲取請求頭:
$http_name- 這是一個(gè)通用變量,
name可以替換為任何請求頭字段名的小寫字母和下劃線形式。例如,獲取Accept-Language頭,使用$http_accept_language。這為根據(jù)請求頭信息做差異化處理提供了極大靈活性。
- 這是一個(gè)通用變量,
3. 實(shí)際應(yīng)用舉例
下面通過幾個(gè)常見場景展示這些變量的用法。
記錄詳細(xì)日志
你可以在 log_format中組合使用變量,記錄更豐富的信息。例如,記錄客戶端IP、用戶代理、請求處理時(shí)間和響應(yīng)狀態(tài):
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time';訪問控制與重定向
根據(jù)參數(shù)重寫URL:
if ($arg_version = "v2") {
rewrite ^/api/(.*)$ /v2/api/$1 last;
}基于原始IP進(jìn)行訪問限制(注意:需確保代理服務(wù)器正確設(shè)置了 X-Forwarded-For):
# 允許來自192.168.1.100和10.0.0.0/8網(wǎng)段的請求
if ($http_x_forwarded_for !~* "^(192\.168\.1\.100|10\..*)") {
return 403;
}代理配置
在反向代理設(shè)置中,常使用變量向后端傳遞原始請求信息:
location /api/ {
proxy_pass http://backend_server;
# 將原始Host頭傳遞給后端
proxy_set_header Host $host;
# 傳遞客戶端真實(shí)IP
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}4. 注意事項(xiàng)
- 變量使用場景:并非所有變量都可以在所有配置指令中使用,具體需參考Nginx官方文檔。
- 條件判斷:在Nginx配置中,尤其是在
if指令中使用變量進(jìn)行字符串匹配或條件判斷時(shí),需要特別注意Nginx的匹配規(guī)則,有時(shí)可能需要使用~*(不區(qū)分大小寫匹配)或~(區(qū)分大小寫匹配)等操作符 。 - 變量性能:大部分內(nèi)置變量開銷很小,但頻繁在復(fù)雜邏輯或高并發(fā)場景下使用某些涉及字符串處理的變量仍需注意。
到此這篇關(guān)于Nginx內(nèi)置變量應(yīng)用場景分析的文章就介紹到這了,更多相關(guān)nginx內(nèi)置變量內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Nginx反向代理WebSocket響應(yīng)403的解決辦法
本篇文章主要介紹了詳解Nginx反向代理WebSocket響應(yīng)403的解決辦法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01
nginx如何通過proxy_pass設(shè)置反向代理,隱藏端口號
這篇文章主要介紹了nginx如何通過proxy_pass設(shè)置反向代理,隱藏端口號方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
Nginx常用命令和部署詳解以及實(shí)戰(zhàn)案例示范
這篇文章主要介紹了Nginx的常用命令和在不同環(huán)境下的部署方法,包括在CentOS和Docker中部署Nginx,并詳細(xì)說明了如何配置Nginx以實(shí)現(xiàn)實(shí)時(shí)刷新數(shù)據(jù)和數(shù)據(jù)分析系統(tǒng)的場景,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-02-02
Nginx實(shí)現(xiàn)靜態(tài)資源壓縮的方法詳解
靜態(tài)資源過大,下載耗時(shí)導(dǎo)致頁面打開慢,希望通過壓縮減小文件大小,提升下載速度,所以本文給大家介紹了Nginx實(shí)現(xiàn)靜態(tài)資源壓縮的方法,并通過代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02

