2014-09-19 26 views
11

對於Nginx來說,我是一個相當新的東西,它似乎很混亂。我有我的服務器設置完美,但問題是,因爲我的服務器使用HTTP代理保護;而不是記錄真實的用戶IP,它記錄代理服務器IP。Nginx使用X-Forwarded替換REMOTE_ADDR

我試着做的是將$_SERVER['REMOTE_ADDR'];設置爲$_SERVER['X-Forwarded-For'];但我得到一個未定義的索引錯誤,所以我猜我必須在Nginx中定義X-Forwarded-For?但是我不知道該怎麼做,我有一個簡單的設置,它只是帶有PHP的Nginx。沒有更多,沒有更多。

我在網上搜索過,但實際上找不到一些友善理解的信息。

我有權訪問源代碼,如果這有點幫助。我嘗試了很多解決方案,但無濟於事。

回答

0

我解決我自己的問題,因爲PHP獲得通過FastCGI的過濾,我只是添加了設置REMOTE_ADDR給變量http_x_forwarded_for快速CGI PARAM,所以類似這樣:

fastcgi_param REMOTE_ADDR $http_x_forwarded_for; 
+0

這是一種方式,但你怎麼處理這種情況的請求進來不通過代理服務器的情況下,這樣的作爲'localhost'的測試請求? – Brad 2015-01-07 17:57:21

+1

不要這樣做。如果原始客戶端發送X-Forwarded-For報頭(代理服務器執行此操作),這將失敗,因爲那麼您的REMOTE_ADDR將有2個以彗形文字分隔的IP。 – 2017-02-22 04:46:42

12

這樣做的正確方法這是通過在nginx中設置real_ip_header配置。

例與信任HTTP代理服務器IP:

set_real_ip_from 127.0.0.1/32; 
real_ip_header X-Forwarded-For; 

這樣,$ _ SERVER [ 'REMOTE_ADDR']將在正確的FastCGI PHP填補了。

Documentation link - nginx.org

+0

我一直在尋找一個真正有效的解決方案。非常感謝!!!!真棒!只要把它放在你的.. 服務器位置〜\ .php $ { block section。這一切工作!做得好! – 2015-07-08 15:50:40

-2

我有同樣的問題。你說得對,你應該增加的FastCGI PARAM: location ~ \.php$ { fastcgi_pass unix:/var/run/php5-fpm/php-fpm.sock; fastcgi_index index.php; fastcgi_param CUSTOM_PARAM "CUSTOM_VALUE"; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include /etc/nginx/fastcgi_params; fastcgi_param REMOTE_ADDR $http_x_real_ip; } 默認情況下,選擇在REMOTE_ADDR是/etc/nginx/fastcgi_params規定: fastcgi_param REMOTE_ADDR $remote_addr; 它不是價值,即來自代理通頭。
確保您將其更改爲fastcgi_params文件或在包含語句後進行設置。

5

$http_x_forwared_for可能包含多個IP地址,其中第一個應該是客戶端IP。 REMOTE_ADDR應該只是客戶端IP。所以

通過在nginx.conf使用正則表達式,你可以設置REMOTE_ADDR$http_x_forwarded_for第一個IP,像這樣:

set $realip $remote_addr; 
    if ($http_x_forwarded_for ~ "^(\d+\.\d+\.\d+\.\d+)") { 
    set $realip $1; 
    } 
    fastcgi_param REMOTE_ADDR $realip;