我有一个网站设置与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?谢谢.
不确定是否REMOTE_ADDR
可以这样改变......
实际上,您可能需要安装/启用另一个Apache模块,如(引用):mod_rpaf
当满足两个条件时,它会更改其他Apache模块可见的客户端的远程地址.
第一个条件是远程客户端实际上是httpd.conf中定义的代理.
其次,如果有一个传入的X-Forwarded-For标头,并且代理在其已知代理列表中,它将从传入的X-Forwarded-For标头获取最后一个IP,并在请求结构中更改客户端的远程地址.
它还会接收传入的X-Host标头并相应地更新虚拟主机设置.
对于Apache2 mod_proxy,它采用X-Forwared-Host标头并更新虚拟主机
这是一篇关于它的博客文章:Nginx代理到Apache - 使用mod_praf访问远程主机IP地址
更新:原始链接现在不能正常工作,但也可以作为debian包使用: apt-get install libapache2-mod-rpaf
我已经使用mod_remoteip for Apache解决了这个问题.mod_remoteip适用于Apache 2.5,但多亏了这个人,你也可以在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;