我们有背后ELB EC2一些PHP服务器。 我们想通过连接到服务器的客户机的IP地址来确定区域/地区。 问题是PHP的服务器只能看到ELB的IP地址。 我们希望看到通过ELB通过客户端的IP地址。
Answer 1:
根据AWS文档中,ELB应设定“X -转发,对于”,其保留原始客户端IP地址的HTTP标头:
在X - 转发,对于请求头可帮助您识别客户端的IP地址。 由于负载平衡器拦截客户端和服务器之间的流量,你的服务器访问日志仅包含负载平衡器的IP地址。 看客户端的IP地址,使用的X转发,对于请求头。
您可以使用下面的PHP代码(假设Apache)的访问:
$http_headers = apache_request_headers();
$original_ip = $http_headers["X-Forwarded-For"];
Answer 2:
如果您使用Apache,看看在mod_remoteip模块。 它包括了Apache 2.4和较新的,但也可发现2.2反向移植。
该模块将覆盖在与RemoteIPHeader指令配置的请求头中报告的用户代理的IP地址连接的客户端的IP地址。
一旦更换的指示,此重写用户代理的IP地址,然后用于mod_authz_host需要IP功能,由mod_status的报道,由mod_log_config%和核%格式的字符串记录。 连接的基本客户机IP是在%{C}格式字符串可用。
换句话说,您可以设置要使用的标题(如X - 转发,对于)和IP公司是值得信赖的(例如,您的负载均衡)。 可信的IP是从报头去除,并且第一不可信IP被用作始发客户机。 这个IP然后在内部被Apache在其它模块,例如用于记录,主机认证等所使用
这使得它比只处理PHP中的XFF头更为有用,因为mod_remoteip负责整个堆栈,可以确保你的访问日志是正确的,等等。
注:还有一个mod_rpaf模块,其前身为这一个。 这是非常有限的。 例如,它不能处理可信的IP范围。 你需要这个,因为你不知道ELB的IP事前。 它也不能处理多跳,如光油之前ELB,Apache之前。 我建议跳过rpaf模块,并使用REMOTEIP代替。
Answer 3:
这是一个大问题,所以试试这个:d
<?php
if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) {
$real_client_ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
} else {
$real_client_ip = $_SERVER["REMOTE_ADDR"];
}
Answer 4:
这似乎可能mod_cloudflare一些更好的选择-特别是具有V2.2的用户在这章的博客了解更多: http://knowledgevoid.com/blog/2012/01/13/logging-the-correct-ip-address-using-阿帕奇-2-2-X-和亚马逊弹性的负载均衡器/
Answer 5:
背后AWS ELB PHP应用最佳解决方案:
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$commaPos = strrchr($_SERVER['HTTP_X_FORWARDED_FOR'], ',');
if ($commaPos === FALSE) $remote_addr = $_SERVER['HTTP_X_FORWARDED_FOR'];
else $remote_addr = trim(substr($_SERVER['HTTP_X_FORWARDED_FOR'], $commaPos + 1));
} else {
$remote_addr = $_SERVER['REMOTE_ADDR'];
}
注: X -转发,对于可以在列表中的逗号空格分隔代理名单, 最后被认为连接到AWS的ELB的一个,因此只有一个,我们可以信任不被欺骗。
Answer 6:
你可以有客户明确地报告其IP地址? 检查这个职位 。