首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在调用php之前如何在apache中设置REMOTE_ADDR?

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

Stack Overflow用户
提问于 2010-02-25 01:52:42
回答 10查看 41.9K关注 0票数 13

我建立了一个网站,使用nginx作为运行php的apache 2.2的反向代理。从apache和php的角度来看,所有请求的IP地址都是nginx服务器。我想让php看到和nginx看到的相同的远程IP。

Nginx设置一个头部X-Real-IP,其中包含nginx看到的远程IP。我试着在apache conf中这样做:

代码语言:javascript
复制
SetEnvIf ^X-Real-IP$ "(.+)" REMOTE_ADDR=$1

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

代码语言:javascript
复制
$_SERVER['REMOTE_ADDR']

不管怎么说,这不管用。您可以不在apache配置文件中设置REMOTE_ADDR吗?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 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

票数 16
EN

Stack Overflow用户

发布于 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并使用以下命令进行编译

代码语言:javascript
复制
apxs -i -a -c mod_remoteip.c

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

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

代码语言:javascript
复制
LoadModule remoteip_module    modules/mod_remoteip.so

在httpd.conf中添加RemoteIPHeader指令

代码语言:javascript
复制
RemoteIPHeader X-Forwarded-For

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

代码语言:javascript
复制
RemoteIPHeader X-Real-IP

重新启动Apache。如果您已经在nginx中设置了代理标头,那么它将会像一个咒语一样工作,并且Apache中的remote_addr将是正确的。

代码语言:javascript
复制
# nginx conf    
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
票数 9
EN

Stack Overflow用户

发布于 2013-04-13 02:11:48

Apache (需要mod_headers模块):

代码语言:javascript
复制
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:

代码语言:javascript
复制
SetEnvIf X-Real-IP "^(.*)" XFF_CLIENT_IP=$1
RequestHeader set REMOTE_ADDR %{XFF_CLIENT_IP}e

在PHP中:

代码语言:javascript
复制
$_SERVER["HTTP_REMOTE_ADDR"]

-或者-

代码语言:javascript
复制
$_SERVER["REMOTE_ADDR"]

不需要非核心Apache模块

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2328225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档