apache - 如何在 Apache config 中的 http 请求上使用 x-forward-for 而不是 LB IP 读取 Client-IP
问题描述
我需要在 httpd conf 中使用真实 IP 而不是 Proxy / Loabalancer IP 的 RewriteCond 语法。我的用例是一个维护页面,应该向所有用户显示,除了我的例外列表中的一些用户,由单独文件中列出的 IP 地址定义。
我已经在 apache 中将 REMOTE_ADDR 设置为 X-Forwarded-For 但我没有得到我需要的点。
我已将 Logformat 配置为
LogFormat "%{X-Forwarded-For}i \"test\" %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
我的输出是
www.xxx.yyy.zzz "test" 10.0.0.215 - - [22/May/2019:11:09:20 +0200]
但也可能是
www.xxx.yyy.zzz, 10.0.0.12 "test" 10.0.0.215 - - [22/May/2019:11:09:19 +0200]
所以我需要在我的用例中提取的第一个 IP。我的 httpd.conf 中有什么:
RewriteMap exceptions /appli/tecracer/apps/helios-fas/maintenance/exceptions.map
# Allow Individual IP addresses past maintenance page
RewriteCond ${exceptions:%{REMOTE_ADDR}} =OK
RewriteRule ^ - [L]
我需要的是真实 IP,而不是 REMOTE_ADDR,它是 X-Forward-For 标头信息的第一个条目。我如何才能提取这个并且我可以相信第一个 IP 每次都是客户端 IP?
解决方案
你看过 remoteip_module apache 模块吗?
你需要包含它,配置很简单:
LoadModule remoteip_module modules/mod_remoteip.so
RemoteIPHeader x-forwarded-for
我的代理是 haproxy,在后端部分:
option forwardfor
forwardfor 选项确保转发的请求包含实际的客户端 IP 地址。
那么 remote_addr 将是客户端 IP
推荐阅读
- java - 我需要能够输入一个字符串并找到特定单词的出现次数
- javascript - 通过javascript将大文件上传到服务器
- vb6 - TABCTL32.ocx 的 VB6 RegFreeCom SideBySide SxS 清单测试
- flutter - 注销提供者和共享首选项的最佳方法
- c# - ASP.NET MVC - 如何限制分页元素的数量并在有很多记录时使用'...'(三个点)进行过滤
- terraform - Terraform 自动缩放组标记的问题
- composer-php - 如何运行作曲家安装?
- javascript - NodeJS - ChildProcess execFile - Uncaught Error: spawn ENOENT
- python - 手动更改 plotly scatterpolar 标签
- php - 尝试使用 PHP 运行 Mailgun 电子邮件时出错