在apache中将REMOTE_ADDR设置为X-Forwarded-For

tyl*_*erl 13 apache cgi http

在Apache坐在反向代理(例如Squid)后面的情况下,cgi环境变量REMOTE_ADDR获取代理的地址而不是客户端.

但是,代理将设置一个名为X-Forwarded-For包含客户端原始IP地址的标头,以便Apache可以看到它.

问题是,我们如何让Apache替换标头中REMOTE_ADDR的值,X-Forwarded-For以便所有Web应用程序都能透明地看到正确的地址?

小智 14

你可以使用mod_rpaf.http://stderr.net/apache/rpaf/

  • 我是这样的,但是要注意,显然rpaf不占用网络范围.因此,如果您的提供商正在为您做平衡,您必须希望他们永远不会更改其平衡器IP.另外,ubuntu 12.04没有正确加载conf,你必须在rpaf.conf中注释掉<IfModule mod_rpaf.c>和结束</ IfModule>,否则它不会加载那个conf. (2认同)

小智 7

请注意,如果请求已遍历多个代理,则X-Forwarded-For标头可能包含IP地址列表.在这种情况下,您通常需要最左边的IP.您可以使用SetEnvIf提取它:

SetEnvIf X-Forwarded-For "^(\d{1,3}+\.\d{1,3}+\.\d{1,3}+\.\d{1,3}+).*" XFFCLIENTIP=$1
Run Code Online (Sandbox Code Playgroud)

注意用$ 1设置XFFCLIENTIP环境变量保持第一组的内容在正则表达式(括号).

然后,您可以使用环境变量的值来设置标头(或以Apache日志格式使用它,以便日志包含实际的客户端IP).

  • 我认为您的正则表达式是不正确的:您想获取X-Forwarded-For标头中最右边的IP地址,而不是最左边的IP地址。您的表达式应该改为`“ ^。*?(\ d {1,3} + \。\ d {1,3} + \。\ d {1,3} + \。\ d {1,3} + $”`。 (2认同)

Kir*_*rus 7

目前 apache 模块 mod_remoteip 是推荐的方法;rpaf 没有得到可靠的维护,可能会导致问题。