如何在调用php之前在apache中设置REMOTE_ADDR

时间:2010-02-24 17:52:42

标签: php apache

我有一个网站设置,nginx充当apache 2.2的反向代理,运行php。从apache和php的角度来看,所有请求的IP地址都是nginx服务器。我希望php能够看到nginx看到的相同的远程IP。

Nginx设置标题X-Real-IP,其中包含nginx看到的远程IP。我尝试在apache conf中做这样的事情:

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

我希望我可以设置REMOTE_ADDR环境变量,当最终调用php时,它会看到nginx看到的远程IP。我认为php代码是这样做的:

$_SERVER['REMOTE_ADDR']

无论如何,这不起作用。有任何想法吗?你能不在apache配置文件中设置REMOTE_ADDR?感谢。

9 个答案:

答案 0 :(得分:14)

不确定REMOTE_ADDR是否可以这样改变......


实际上,您可能需要安装/启用另一个Apache模块,例如mod_rpaf (引用)

  

它改变了远程地址   客户端对其他Apache模块可见   当两个条件满足时。   
第一个条件是遥控器   客户端实际上是一个代理   在httpd.conf中定义。
其次,如果   有一个传入的X-Forwarded-For   标题和代理在它的列表中   已知代理它需要最后一个IP   来自传入的X-Forwarded-For   标题并更改远程地址   请求中的客户端   结构体。
它也需要   传入的X-Host标头并更新   相应的虚拟主机设置。   
对于Apache2 mod_proxy,它需要   X-Forwared-Host标头并更新   virtualhosts

以下是关于该帖子的博文:Nginx proxy to Apache - access remote host IP address using mod_praf

更新:原始链接现在无法正常工作,但也可以作为debian包使用:apt-get install libapache2-mod-rpaf

答案 1 :(得分:8)

我已经使用mod_remoteip for Apache解决了这个问题。 mod_remoteip适用于Apache 2.5,但感谢this guy,您也可以在Apache 2.2.x上使用它。

https://gist.github.com/1042237下载mod_remoteip.c并使用

进行编译
apxs -i -a -c mod_remoteip.c

这应该在modules目录中创建mod_remoteip.so副本。 apxs还会在httpd.conf中为新创建的模块添加LoadModule指令。

打开httpd.conf并检查mod_remoteip的LoadModule指令是否存在

LoadModule remoteip_module    modules/mod_remoteip.so

在httpd.conf中添加RemoteIPHeader指令

RemoteIPHeader X-Forwarded-For

该指令将指示mod_remoteip将来自nginx的X-Forwarded-For值用作remote_addr。您也可以使用X-Real-IP:

RemoteIPHeader X-Real-IP

重启Apache。如果你在nginx中设置了代理头,那么它将像魅力一样工作,Apache中的remote_addr将是正确的

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

答案 2 :(得分:2)

您可以尝试这个简单的PHP模块

https://github.com/yohgaki/realip

它只是用X-Forwarded-For或X-Real-IP重写$ _SERVER ['REMOTE_ADDR'],无论你喜欢什么标题。您可以使用许多不同的方法来完成此操作,但我只想将其作为PHP模块来完成。所以我写了它。

答案 3 :(得分:1)

我不知道REMOTE_ADDR是否可以被操作 - 可能是它不能 - 但你应该能够通过像

这样的东西来获取PHP中的X-Real-IP头

$ _ SERVER [ “HTTP_X_Real_IP”]

或类似 - 请检查phpinfo()是否有正确的表示法。

此外,.htaccess中设置的Apache环境变量应该在PHP中可见。

答案 4 :(得分:1)

Apache(需要mod_headers模块):

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

SetEnvIf RegEx的REF:https://stackoverflow.com/a/10346093

也可以,但不会将输入验证为IP:

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

在PHP中:

$_SERVER["HTTP_REMOTE_ADDR"]

-OR -

$_SERVER["REMOTE_ADDR"]

不需要非核心Apache模块

答案 5 :(得分:1)

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

解决了所有问题,REMOTE_ADDRR现在看起来很好!..

答案 6 :(得分:0)

关闭袖口..但是你可以使用一些重写魔法将标题X-Real-IP作为变量传递给php吗?在调用PHP之前,htaccess不能使用头信息吗?

答案 7 :(得分:0)

你可能想要实际使用它:http://httpd.apache.org/docs/2.3/mod/mod_remoteip.html。具有相当多的功能,并由apache自己维护。

编辑:我指的是上面的mod_rpaf建议。

答案 8 :(得分:0)

使用Apache 2.4,您可以定义用于哪个字段。 https://httpd.apache.org/docs/2.4/mod/mod_remoteip.html