Django无法在AWS Elastic Beanstalk负载平衡环境中获取用户IP

时间:2019-06-20 14:16:15

标签: python django amazon-web-services amazon-elastic-beanstalk

我在AWS Elastic Beanstalk中设置了负载平衡的环境,其中部署了Django应用并运行Django-user-sessions。我希望它能够记录用户会话的外部IP地址,但是记录的所有内容都是内部IP。我有另一个没有负载均衡的环境,并且正在收集外部用户IP,因此,我相当确定用户IP将被负载均衡器的内部IP覆盖。

我尝试安装django-xforwardedfor-middleware,该软件应该为每个请求添加request.META['REMOTE_ADDR'] = request.META['HTTP_X_FORWARDED_FOR'].split(',')[0].strip(),但这并不能解决问题。

我的.ebextensions中还有一个HTTPS引擎重写,它不是在正常运行的环境中运行的,但我认为不是问题所在:

files:
    "/etc/httpd/conf.d/ssl_rewrite.conf":
        mode: "000644"
        owner: root
        group: root
        content: |
            RewriteEngine On
            <If "-n '%{HTTP:X-Forwarded-Proto}' && %{HTTP:X-Forwarded-Proto} != 'https'">
            RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
            </If>

我还有其他方法可以尝试使django-user-sessions收集外部用户IP吗?

1 个答案:

答案 0 :(得分:1)

我发现了问题:x_forwarded_for.middleware.XForwardedForMiddleware的位置很重要。它应该在user_sessions.middleware.SessionMiddleware之前出现:

MIDDLEWARE = [
    ...
    'x_forwarded_for.middleware.XForwardedForMiddleware',
    'user_sessions.middleware.SessionMiddleware',  # the django-user-sessions middleware
    ...
]