我建立了一个网站,使用nginx作为运行php的apache 2.2的反向代理。从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吗?
发布于 2010-02-25 02:00:53
不确定是否可以通过这种方式更改REMOTE_ADDR ...
实际上,您可能需要安装/启用另一个Apache模块,如mod_rpaf (引用):
当两个条件都为satisfied.First时,它改变了客户端的远程地址,对于其他
模块是可见的。条件是远程客户端实际上是一个在httpd.conf中定义的代理。
其次,如果存在传入的X-Forwarded-For标头,并且代理位于它的已知代理列表中,则它从传入的X-Forwarded-For标头中获取最后一个IP,并在请求结构中更改客户端的远程地址。
它还采用传入的X主机标头,并更新Apache2 mod_proxy的虚拟主机设置。它采用X- accordingly.For主机标头,并更新虚拟主机
这里有一篇关于这方面的博客文章:Nginx proxy to Apache - access remote host IP address using mod_praf
更新:原始链接现在不起作用,但它也可以作为debian包使用:apt-get install libapache2-mod-rpaf
发布于 2011-11-20 20:22:18
我已经用Apache的mod_remoteip解决了这个问题。mod_remoteip是针对Apache2.5的,但多亏了this guy,你也可以在Apache2.2.x上使用它。
从https://gist.github.com/1042237下载mod_remoteip.c并使用以下命令进行编译
apxs -i -a -c mod_remoteip.c这将在模块目录中创建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;发布于 2013-04-13 02:11:48
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: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"]-或者-
$_SERVER["REMOTE_ADDR"]不需要非核心Apache模块
https://stackoverflow.com/questions/2328225
复制相似问题