我有一个网站设置,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?感谢。
答案 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