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

如何在调用php之前在apache中设置REMOTE_ADDR,php,apache,Php,Apache,我用nginx建立了一个网站,作为运行php的apache2.2的反向代理。从apache和php的角度来看,所有请求的IP地址都是nginx服务器。我希望php能够看到与nginx相同的远程IP Nginx设置一个标头X-Real-IP,其中包含Nginx看到的远程IP。我在apache配置中尝试过这样做: SetEnvIf ^X-Real-IP$ "(.+)" REMOTE_ADDR=$1 我希望我可以设置REMOTE_ADDR环境变量,当php最终被调用时,它将看到nginx看到的远程I

我用nginx建立了一个网站,作为运行php的apache2.2的反向代理。从apache和php的角度来看,所有请求的IP地址都是nginx服务器。我希望php能够看到与nginx相同的远程IP

Nginx设置一个标头X-Real-IP,其中包含Nginx看到的远程IP。我在apache配置中尝试过这样做:

SetEnvIf ^X-Real-IP$ "(.+)" REMOTE_ADDR=$1
我希望我可以设置REMOTE_ADDR环境变量,当php最终被调用时,它将看到nginx看到的远程IP。我认为php代码是这样做的:

$_SERVER['REMOTE_ADDR']

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

我不知道REMOTE\u ADDR是否可以被操纵-可能是因为它不能-但是您应该能够通过类似的方式在PHP中获得X-Real-IP头

$\u服务器[“HTTP\u X\u Real\u IP”]

或类似-检查
phpinfo()
以了解正确的符号


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

不确定是否可以通过这种方式更改
REMOTE\u ADDR


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

它会更改服务器的远程地址 对其他Apache模块可见的客户端 当满足两个条件时。
第一个条件是遥控器 客户机实际上是一个代理 在httpd.conf中定义<第二,如果 有一个传入的X-Forwarded-For 标头和代理位于其列表中 在已知代理中,它使用最后一个IP 从传入的X-Forwarded-For 标头并更改远程地址 请求中客户端的 结构
它还需要 传入X主机标头并更新 虚拟主机设置。
对于Apache2 mod_代理,需要 X-Forwared-Host标头并更新 虚拟主机

以下是一篇关于这一点的博客文章:


更新:原始链接现在不起作用,但它也可以作为debian软件包提供:
apt get install libapache2 mod rpaf

。。但是,您可以使用一些重写魔法将标题X-Real-IP作为变量传递给php吗。。?htaccess在调用PHP之前不能处理标题信息吗?

您可能想实际使用它:。有更多的特性,由apache自己维护


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

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


它只需使用X-Forwarded-For或X-Real-IP任意头文件重写$\u服务器['REMOTE\u ADDR']。您可以使用许多不同的方法来实现这一点,但我只想将其作为PHP模块来实现。所以我写了它

我已经使用mod_remoteip for Apache解决了这个问题。mod_remoteip适用于Apache2.5,但多亏了它,您也可以在Apache2.2.x上使用它

从下载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值作为远程地址。您也可以改用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;
Apache(需要mod_头模块):

SetEnvIf正则表达式的参考:

也可以工作,但不验证输入是否为IP:

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

$_SERVER["HTTP_REMOTE_ADDR"]
-或-

不需要非核心Apache模块 (sudo apt get安装libapache2 mod rpaf)


已解决所有问题,远程\u ADDRR现在看起来正常

使用Apache2.4,您可以定义使用哪个字段。

+1太好了!很高兴知道这一点。尽管模块的名字听起来像是有人用卡通语言打了别人的脸颊:)作为旁注:我从来没有听说过这个模块;不确定它是否得到很好的支持/稳定/维护/;;不,这个名字听起来很有趣^^不一定是坏事。我相信,如果有一堆“聪明聪明”的漫画,我可以在某处的暴力场景中找到这个词。举例说明:(这是德语,但没关系。)@Pekka:在法语中,我们有时(实际上,几年前)说“Et paafff le chien”——“paf the dog”^^^@拉塞尔:很高兴知道!我自己也有一个apache服务器,使用了一个nginx作为反向代理,我也遇到了同样的问题(但通过修补我的PHP脚本“解决了”)
mod_rpaf
已经被apache的内置代理所取代。一个更正是,它必须是$\u server[“HTTP_X_REAL_IP”],区分大小写,但如果使用mod_rewrite,看起来会有问题。重写的URL将没有正确的远程地址:(mod_remoteip有一个缺陷,它不能与mod_rewrite一起工作,即在重写的URL上,您仍然会得到127.0.0.1。因此,最后,我找到的唯一正确的解决方案是mod_rpaf。编译它并以与我描述的类似的方式安装它,mod_remoteip没有设置REMOTE_ADDR,只有HTTP_REMOTE_ADDR(apache 2.2)。Exelent解决方案!谢谢!
$_SERVER["HTTP_REMOTE_ADDR"]
$_SERVER["REMOTE_ADDR"]