Php çağrılmadan önce apache REMOTE_ADDR nasıl ayarlanır

7 Cevap php

Ben nginx php çalıştıran 2.2, apache bir ters proxy olarak hareket ile kurulmuş bir web sitesi var. Apache ve php bakış açısıyla tüm istekleri IP adresi nginx sunucusudur. Ben görür nginx aynı uzak IP görmek php istiyorum.

Nginx nginx görür uzak IP içeren bir başlık X-Gerçek IP ayarlar. Ben apache conf böyle bir şey yapıyor çalıştı:

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

Benim umudum, REMOTE_ADDR ortam değişkeni ayarlamak olabilir ve php nihayet çağrıldığında aldığında, gördüğü nginx uzak IP görürdünüz oldu. Ben php kodu bu yaptığını düşünüyorum:

$_SERVER['REMOTE_ADDR']

Her neyse, bu çalışmıyor. Herhangi bir fikir? Eğer apache yapılandırma dosyasında REMOTE_ADDR set değil miyim? Teşekkürler.

7 Cevap

Emin değil REMOTE_ADDR bu şekilde değiştirilebilir olup olmadığını ...


Actually, you might need to install / enable another Apache module, like mod_rpaf (quoting) :

It changes the remote address of the client visible to other Apache modules when two conditions are satisfied.
First condition is that the remote client is actually a proxy that is defined in httpd.conf.
Secondly if there is an incoming X-Forwarded-For header and the proxy is in it's list of known proxies it takes the last IP from the incoming X-Forwarded-For header and changes the remote address of the client in the request structure.
It also takes the incoming X-Host header and updates the virtualhost settings accordingly.
For Apache2 mod_proxy it takes the X-Forwared-Host header and updates the virtualhosts

Nginx proxy to Apache - access remote host IP address using mod_praf: İşte bu konuda bir blog-yazı var

Apache için bu kullanarak mod_remoteip çözdük. mod_remoteip Apache 2.5 için ama sayesinde this guy siz de Apache 2.2.x üzerinde kullanabilirsiniz.

https://gist.github.com/1042237 adlı mod_remoteip.c indirin ve ile derlemek

apxs -i -a -c mod_remoteip.c

Bu modüller dizinde mod_remoteip.so kopyasını oluşturmanız gerekir. apxs ayrıca yeni oluşturulan modül için httpd.conf içinde LoadModule yönergesi katacak.

Mod_remoteip var Açık httpd.conf ve onay LoadModule yönergesi yok

LoadModule remoteip_module    modules/mod_remoteip.so

Httpd.conf RemoteIPHeader yönergesini Ekle

RemoteIPHeader X-Forwarded-For

Bu yönerge mod_remoteip REMOTE_ADDR olarak nginx X-Forwarded-For değerini kullanmak için talimat verir. Ayrıca X-Gerçek IP yerine kullanabilirsiniz:

RemoteIPHeader X-Real-IP

Apache yeniden başlatın. Eğer nginx proxy başlıklarını kurduysanız Apache bir cazibe ve REMOTE_ADDR gibi doğru olacaktır çalışacak

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

O olamaz ki olabilir - - Ben REMOTE_ADDR manipüle edilebilir olup olmadığını bilmiyorum ama böyle bir şey ile PHP içinde X-Gerçek IP başlığının ele almak gerekir

$ _SERVER ["HTTP_X_Real_IP"]

veya benzeri - çek phpinfo() Doğru gösterim için.

Ayrıca, belirlenen Apache ortam değişkenleri .htaccess PHP görünür olmalıdır.

Bu basit bir PHP modülü deneyebilirsiniz

https://github.com/yohgaki/realip

Bu sadece ne isterseniz başlığı X-Forwarded-For veya X-Gerçek IP ile $ _SERVER ['REMOTE_ADDR'] yeniden yazar. Birçok farklı yöntem ile bunu başarabilirsiniz, ama sadece PHP modül olarak yapmak istiyorum. Yani ben yazdım.

Apache (mod_headers modülü gereklidir):

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 SetEnvIf RegEx'in için: http://stackoverflow.com/a/10346093

Ayrıca çalışıyor ama IP olarak giriş doğrulamak değildir:

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

PHP:

$_SERVER["HTTP_REMOTE_ADDR"]

-Ya da-

$_SERVER["REMOTE_ADDR"]

Gerekli olmayan hiçbir çekirdek Apache modülleri

Manşet kapalı .. ama bazı rewrite büyü kullanarak php bir değişken olarak başlık X-Gerçek IP geçebileceği ..? Bu PHP çağırır önce htaccess başlık bilgisi ile bir şeyler yapamaz mıyız?

Muhtemelen aslında bu kullanmak istiyorum: http://httpd.apache.org/docs/2.3/mod/mod_remoteip.html. Biraz daha fazla özelliğe sahip ve kendilerini apache tarafından yapılmaktadır.

Düzenleme: Ben yukarıda mod_rpaf öneriye atıfta bulundu.