2010-02-24 10 views
11

Ich habe eine Website eingerichtet mit Nginx als Reverse-Proxy zu Apache 2.2, die PHP ausgeführt wird. Aus der Sicht von Apache und PHP ist die IP-Adresse aller Anfragen der nginx-Server. Ich möchte, dass PHP die gleiche Remote-IP sieht, die nginx sieht.Wie man REMOTE_ADDR in Apache setzt, bevor php aufgerufen wird

Nginx setzt einen Header X-Real-IP, der die Remote-IP enthält, die nginx sieht. Ich habe versucht, in der Apache conf so etwas wie dies zu tun:

SetEnvIf ^X-Real-IP$ "(.+)" REMOTE_ADDR=$1 

Meine Hoffnung war, dass ich die REMOTE_ADDR Umgebungsvariable könnte und wenn PHP schließlich aufgerufen wird, würde es die Remote-IP sehen, die nginx sieht. Ich denke, der PHP-Code macht das:

$_SERVER['REMOTE_ADDR'] 

Wie auch immer, das funktioniert nicht. Irgendwelche Ideen? Können Sie REMOTE_ADDR nicht in der Apache-Konfigurationsdatei einstellen? Vielen Dank.

Antwort

14

Nicht sicher, ob REMOTE_ADDR diese Weise können geändert werden ...


Eigentlich müssen Sie möglicherweise eine andere Apache-Modul installieren/aktivieren, wie mod_rpaf(Zitat):

Es Ändert die Remote-Adresse des Clients, die für andere Apache-Module sichtbar ist, wenn zwei Bedingungen erfüllt sind: .
Erste Bedingung ist, dass der remote Client ein Proxy ist, der in httpd.conf definiert ist.
Zweitens, wenn es eine eingehende X-Forwarded-For Header und der Proxy ist in seiner Liste bekannte Proxies es die letzten IP- aus der eingehenden X-Forwarded-For Header und ändert die Remote-Adresse von Takes Client in der Anfrage Struktur.
Es nimmt auch die eingehende X-Host-Header und aktualisiert die Virtualhost-Einstellungen entsprechend.
Für Apache2 Mod_proxy es den Header X-Forwared-Moderator nimmt und aktualisiert die Virtual

Hier ist ein Blog-Post über das: Nginx proxy to Apache - access remote host IP address using mod_praf

Update: Original-Link jetzt nicht funktioniert, aber es ist auch als Debian-Paket erhältlich: apt-get install libapache2-mod-rpaf

+1

+1 Schön! Das ist gut zu wissen. Auch wenn der Name des Moduls klingt, als würde jemand in Cartoon-Sprache jemanden auf die Wange schlagen :) –

+0

Als Nebenbemerkung: Ich habe noch nie von diesem Modul gehört; nicht sicher, ob es gut unterstützt wird/stabil/gepflegt/... ;; * nein, der Name klingt witzig ^^ nicht unbedingt eine schlechte Sache * –

+0

Ich bin mir sicher, dass bei einem Haufen "Clever & Smart" Comics, könnte ich das Wort irgendwo in einer gewalttätigen Szene verwendet finden. Zur Veranschaulichung: http://www.pekkagaiser.com/stuff/cleversmart.jpg (Es ist deutsch, aber es spielt keine Rolle.) –

1

Ich weiß nicht, ob REMOTE_ADDR manipuliert werden kann - es könnte sein, dass es nicht kann - aber man sollte halten, die X-Real-IP-Header in PHP durch so etwas wie

$ bekommen kann _SERVER ["HTTP_X_Real_IP"]

oder ähnlich - zur korrekten Schreibweise phpinfo() überprüfen.

Auch Apache-Umgebungsvariablen, die in .htaccess festgelegt sind, sollten in PHP sichtbar sein.

+0

Eine Korrektur, es muss $ _SERVER ["HTTP_X_REAL_IP"] sein, Groß- und Kleinschreibung beachten – duganets

0

Aus dem Stand. aber könnten Sie die Kopfzeile X-Real-IP als Variable auf die PHP übergeben mit einigen Rewrite Magie ..? Kann htaccess nicht mit Headerinformationen arbeiten, bevor es PHP aufruft?

0

Wahrscheinlich möchten Sie dies tatsächlich verwenden: http://httpd.apache.org/docs/2.3/mod/mod_remoteip.html. Hat einiges mehr Features und wird von Apache selbst gepflegt.

Edit: Ich bezog mich auf den Vorschlag mod_rpaf oben.

+0

mod_remoteip saugt .. funktioniert nicht mit mod_rewrite – ColinM

2

können Sie dieses einfache PHP-Modul

https://github.com/yohgaki/realip

versuchen Es umschreibt einfach $ _SERVER [ 'REMOTE_ADDR'] mit X-Forwarded-For oder X-Real-IP-Header was Sie möchten. Sie können dies mit vielen verschiedenen Methoden erreichen, aber ich würde es gerne als PHP-Modul machen. Also habe ich es geschrieben.

6

Ich habe dies mit mod_remoteip für Apache gelöst. mod_remoteip ist für Apache 2.5 aber dank this guy können Sie es auch auf Apache 2.2.x verwenden.

herunterladen mod_remoteip.c von https://gist.github.com/1042237 und kompilieren Sie es mit

apxs -i -a -c mod_remoteip.c 

Dies sollte mod_remoteip.so Kopie im Modul-Verzeichnis erstellen. apxs fügt auch die LoadModule-Anweisung in Ihrer httpd.conf für das neu erstellte Modul hinzu.

öffnen httpd.conf und Kontrolle tut LoadModule- Richtlinie für mod_remoteip

LoadModule remoteip_module modules/mod_remoteip.so 

RemoteIPHeader Direktive in httpd.conf hinzufügen existiert

RemoteIPHeader X-Forwarded-For 

Diese Richtlinie mod_remoteip anweisen, wird X-Forwarded-For-Wert zu verwenden, von nginx als remote_addr. Sie können stattdessen auch X-Real-IP verwenden:

RemoteIPHeader X-Real-IP 

Starten Sie den Apache neu. Wenn Sie die Proxy-Header in nginx gesetzt haben, wird es wie ein Zauber und remote_addr in Apache funktionieren korrekt

# nginx conf  
proxy_set_header X-Real-IP $remote_addr; 
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
+3

Aber es sieht so aus Es gibt ein Problem, wenn Sie mod_rewrite verwenden. Wiedergeschriebene URLs haben keine korrekte remote_addr :( – mileusna

+1

mod_remoteip hat einen Fehler und funktioniert nicht mit mod_rewrite, dh bei neu geschriebenen URLs bekommst du immer noch die 127.0.0.1. Am Ende ist die einzige richtige Lösung, die ich gefunden habe, mod_rpaf. Kompiliere es und installiere es auf ähnliche Weise, wie ich es für mod_remoteip beschrieben habe – mileusna

1

Apache (erfordert mod_headers Modul) sein:

SetEnvIf X-Real-IP "^(\d{1,3}+\.\d{1,3}+\.\d{1,3}+\.\d{1,3}+).*" XFF_CLIENT_IP=$1 
RequestHeader set REMOTE_ADDR %{XFF_CLIENT_IP}e 

REF für SetEnvIf RegEx: https://stackoverflow.com/a/10346093

auch

Works jedoch nicht überprüfen, Eingang als IP:

SetEnvIf X-Real-IP "^(.*)" XFF_CLIENT_IP=$1 
RequestHeader set REMOTE_ADDR %{XFF_CLIENT_IP}e 

In PHP:

$_SERVER["HTTP_REMOTE_ADDR"] 

-oder

$_SERVER["REMOTE_ADDR"] 

keine Module erforderlich

Apache Nicht-Kern
+3

REMOTE_ADDR nicht gesetzt, nur HTTP_REMOTE_ADDR (apache 2.2). – user1050755

1

Mod_rpaf (sudo apt-get install libapache2-mod-rpaf)

löste alle Probleme und REMOTE_ADDRR sieht jetzt Ok! ..

Verwandte Themen