2010-11-17 144 views
0

我有一个服务在Amazon Ec2中运行。该服务公开了一个http端点和一个https端点。我在记录数据时正在对用户IP地址进行一些地理位置查找。对于进入http端点的请求,一切正常。我必须抓住X-Forwarded-For标题,这样我才不会拿亚马逊负载平衡器UP地址,我总能得到我所需要的。但是,对于https端点上的请求,所有IP地址都是相同的。如何在SSL请求上获取请求IP地址

为了拉IP地址,我使用下面的C#代码:

public static string FetchClientIp(HttpRequest req) 
    { 
     var value = req.Headers["X-Forwarded-For"]; 
     return string.IsNullOrEmpty(value) ? req.UserHostAddress : value; 
    } 

我无法找到任何东西,我需要做的是针对HTTPS请求,所以我希望有人之前已经遇到过这个问题。我要对此进行测试,以便更好地隔离问题。

感谢

+0

这显然是亚马逊流量管理这是问题,它是非常深奥的,所以我不知道你会有多少运气在这里。建议您咨询供应商论坛或支持。 – annakata 2010-11-17 19:17:14

+0

疯狂的建议:您肯定知道与您连接的端点的IP不是客户端IP地址吗? – 2010-11-17 22:17:57

回答

0

这取决于你如何让您的ELB成立。

如果您在ELB(new feature as of October 2010)上终止SSL,则客户端IP地址将位于“X-Forwarded-For”中。

HttpContext.Current.Request.Headers["X-Forwarded-For"] 

这听起来像你在你的web服务器终止SSL,那么ELB无法解密流量,并添加“X - 转发,对于”头到HTTP请求。因此,头部“REMOTE_ADDR”(即HttpRequest.UserHostAddress返回的头部)中的客户端IP地址是最后一跳的IP地址 - 在这种情况下是ELB的内部IP地址。

请记住,“X-Forwared-For”可能包含多个IP地址,如http://docs.amazonwebservices.com/ElasticLoadBalancing/latest/DeveloperGuide/index.html?SvcIntro.html#X-Forwarded-For所述。在这种情况下,您可能对列出的第一个地址最感兴趣。