天天看點

Nginx $remote_addr和$proxy_add_x_forwarded_for變量詳解

代表用戶端IP。注意,這裡的用戶端指的是直接請求Nginx的用戶端,非間接請求的用戶端。假設使用者請求過程如下:

那麼,預設情況下,針對Nginx1而言,<code>$remote_addr</code>為使用者用戶端IP,對Nginx2而言,<code>$remote_addr</code>則為Nginx1的IP。此時如果希望Nginx2也可以擷取使用者用戶端IP,那要怎麼處理呢?答案如下:

在Nginx1配置檔案中使用<code>proxy_set_header</code>為轉發請求設定請求頭

然後,在Nginx2 配置檔案中通過<code>$http_x_real_ip</code>來擷取<code>X-Real-IP</code>請求頭的值來擷取真實用戶端IP.

此時,如果要求“後端伺服器”也要擷取使用者用戶端IP,咋處理呢?做法和上述類似,在Nginx2配置檔案中,使用<code>proxy_set_header</code>做同樣的配置,即:

然後,“後端伺服器”擷取請求頭“X-Real-IP”的值即為使用者用戶端IP。

很多HTTP代理會在HTTP協定頭中添加<code>X-Forwarded-For</code>頭,用來追蹤請求的來源。<code>X-Forwarded-For</code>的格式如下:

<code>X-Forwarded-For</code>包含多個IP位址,每個值通過逗号+空格分開,最左邊(client1)是最原始用戶端的IP位址,中間如果有多層代理,每一層代理會将連接配接它的用戶端IP追加在<code>X-Forwarded-For</code>右邊。

代表附加<code>$remote_addr</code>變量的用戶端請求頭<code>X-Forwarded-For</code> ,其值如果包含多個位址,用逗号+空格分隔,标準格式如下:

如果<code>X-Forwarded-For</code>字段沒出現在用戶端請求頭,<code>$proxy_add_x_forwarded_for</code> 等同于<code>$remote_addr</code> 變量。

這裡,假設使用者請求過程和上文所述一樣,如下:

假設,僅在Nginx1配置檔案中進行了以下配置

那麼,Nginx2配置的<code>X-Forwarded-For</code>請求頭的值即為<code>clientIP</code>,當然,這個結論的前提是,用戶端IP沒有配置<code>X-Forwarded-For</code>請求頭,因為如上所述,用戶端沒有出現這個請求頭時,<code>$proxy_add_x_forwarded_for</code> 的值即為<code>$remote_addr</code> 變量的值,否則,則是用戶端為<code>X-forwarded-for</code>請求頭的實際值。

接着,假設Nginx2配置檔案也進行以下配置

那麼,“後端伺服器”擷取的<code>X-Forwarded-For</code>請求頭的值将為<code>clientIP, Nginx1IP</code>。也就是說以上指令的執行是個疊加的過程(類似Python的清單的<code>append</code>方法的處理過程),可以簡單了解為如果存在上級代理,執行以上指令時,會把上級代理IP追加到X-Forwarded-For請求頭總,否則把用戶端IP <code>$remote_addr</code>、或者用戶端<code>X-Forwarded-For</code>請求頭的值(如果有的話)追加到X-Forwarded-For請求頭中。

參考連接配接:

https://nginx.org/en/docs/http/ngx_http_core_module.html#var_remote_addr

https://nginx.org/en/docs/http/ngx_http_proxy_module.html#var_proxy_add_x_forwarded_for

作者:授客

QQ:1033553122

全國軟體測試QQ交流群:7156436

Git位址:https://gitee.com/ishouke

友情提示:限于時間倉促,文中可能存在錯誤,歡迎指正、評論!

作者五行缺錢,如果覺得文章對您有幫助,請掃描下邊的二維碼打賞作者,金額随意,您的支援将是我繼續創作的源動力,打賞後如有任何疑問,請聯系我!!!

           微信打賞                       

支付寶打賞                  全國軟體測試交流QQ群  

Nginx $remote_addr和$proxy_add_x_forwarded_for變量詳解
Nginx $remote_addr和$proxy_add_x_forwarded_for變量詳解
Nginx $remote_addr和$proxy_add_x_forwarded_for變量詳解

繼續閱讀