2014-09-19 18 views
11

Jestem całkiem nowy dla Nginx i wydaje mi się, że jest taki mylący. Mam doskonale skonfigurowany serwer, ale problem jest, ponieważ mój serwer jest chroniony za pomocą serwera proxy HTTP; zamiast rejestrować rzeczywiste adresy IP użytkowników, rejestruje IP serwera proxy.Nginx zastępuje REMOTE_ADDR z X-Forwarded - dla

Próbowałem ustawić $_SERVER['REMOTE_ADDR']; na $_SERVER['X-Forwarded-For'];, ale otrzymuję niezdefiniowany błąd indeksu, więc zgaduję, że muszę zdefiniować X-Forwarded-For w Nginx? Ale nie wiem, jak to zrobić, mam prostą konfigurację, to po prostu Nginx z PHP. Nic dodać nic ująć.

Przeszukałem całą sieć, ale nie mogę znaleźć informacji przyjaznych dla zrozumienia.

Mam dostęp do kodu źródłowego, jeśli to trochę pomaga. Próbowałem wielu rozwiązań, ale bezskutecznie.

Odpowiedz

0

I rozwiązać własne problemy, ponieważ PHP zostaje przefiltrowany przez FastCGI, po prostu dodaje szybki CGI param który ustawiony REMOTE_ADDR zmiennej http_x_forwarded_for, więc coś podobnego do tego:

fastcgi_param REMOTE_ADDR $http_x_forwarded_for; 
+0

To jeden ze sposobów, ale w jaki sposób obsługiwać przypadki, w których wnioski nie wchodzą w za pośrednictwem pełnomocnika, takie jako żądania testowe z 'localhost'? – Brad

+1

Nie rób tego. To się nie powiedzie, jeśli oryginalny klient wyśle ​​nagłówek X-Forwarded-For (proxy to robi), ponieważ wtedy twój REMOTE_ADDR będzie miał 2 adresy IP rozdzielone przecinkami. –

12

poprawny sposób robi polega to na ustawieniu konfiguracji real_ip_header w nginx.

Przykład z witryna HTTP proxy IP:

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

ten sposób $ _SERVER [ 'REMOTE_ADDR'] zostanie poprawnie wypełniony w PHP FastCGI.

Documentation link - nginx.org

+0

Szukałem WIĘCEJ dla rozwiązania, które faktycznie działa. Dziękuję bardzo!!!! NIESAMOWITE! Po prostu umieść go w swoim .. serwer { lokalizacja ~ \ .php $ { blok sekcji. i wszystko działa !!!! DOBRA ROBOTA! –

-2

miałem ten sam problem. Masz rację, należy dodać 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; } Domyślnie opcja REMOTE_ADDR określonego w /etc/nginx/fastcgi_params: fastcgi_param REMOTE_ADDR $remote_addr; Nie jest to wartość, która pochodzi z proxy przejścia cel.
Upewnij się, że został zmieniony w pliku fastcgi_params lub ustaw go po instrukcji include.

5

$http_x_forwared_for może zawierać wiele adresów IP, gdzie pierwszym powinno być IP klienta. REMOTE_ADDR powinno być tylko IP klienta.

Więc za pomocą wyrażenia regularnego w nginx.conf można ustawić REMOTE_ADDR do pierwszego IP $http_x_forwarded_for tak:

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