怎樣才能得到nginx做反向代理時的真實IP? nginx在轉發的時候可以通過添加特定的頭來顯示原始IP地址 通常使用X-Forwarded-For或CLIENT_IP來表示原始IP地址 IP地址都是以逗號來追加IP地址 所以取該請求頭的第一個值,一般就是原始的IP地址。

測試程序代碼(后續測試基于它):
// g++ -g -o hello.cgi hello.cpp
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("Content-Type: text/html; charset=utf-8/r/n/r/n");printf("<p>HTTP_X_FORWARDED_FOR: %s/n", getenv("HTTP_X_FORWARDED_FOR"));printf("<p>HTTP_X_REAL_IP: %s/n", getenv("HTTP_X_REAL_IP"));printf("<p>REMOTE_ADDR: %s/n", getenv("REMOTE_ADDR"));printf("<p>");
return 0;
}
測試是在nginx自帶配置文件nginx.conf上進行的修改:
proxy_set_header可以添加在nginx.conf的http段,也可以是server段,還可以是location段,一級一級間是繼承和覆蓋關系。
如果正確編譯和配置了nginx反向代理,當只有一層nginx反向代理時,可以通過“HTTP_X_REAL_IP”取得client的真實IP。
如果有二層nginx反向代理,則client的真實IP被包含在“HTTP_X_FORWARDED_FOR”中。
最不可信的是“REMOTE_ADDR”,它的內容完全可以被client指定!總之只要編譯和配置正確,“HTTP_X_FORWARDED_FOR”總是包含了client的真實IP。