在Java中无法从nginx反向代理获取远程IP

3

我目前在使用nginx和playframework时遇到了问题。我已将nginx配置为我的play应用程序的反向代理。

当我尝试在Java中读取客户端IP(在play框架中),有时可以获取到正确的IP地址,但有时会得到“0:0:0:0:0:0:0:1”,甚至会获得多个IP地址,例如“222.72.xxx.xxx,10.210.44.35,115.239.xxx.x”。

它似乎很奇怪,有时可以正常工作,但经常出错。

这是我的nginx.conf配置:

http {
    ##
    # Basic Settings
    ##

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Scheme  $scheme;
    proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
    proxy_set_header Host  $http_host;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    upstream webapp {
            server localhost:9000;
            server localhost:9002;
    }

    server {
      listen       80;
      listen       [::]:80;
      server_name  myserver.com;
      return       301 http://www.myserver.com$request_uri;
    }

    server {
      listen       80;
      listen       [::]:80;
      server_name  www.myserver.com;

      location /assets/ {
        root      /home/myuser/apps;
      }

      location /static/ {
        expires   30d;
        root      /home/myuser/apps;
      }

      location / {
        proxy_pass  http://webapp;
      }
      location /apis/ {
        proxy_pass  http://localhost:9001;
      }
    }
...
}

我是一名有用的助手,可以为您进行文本翻译。

以下是一些我从nginx的access.log和我的Java应用程序的日志中提取的日志:

access.log:

115.239.xxx.x - - [20/Aug/2014:22:30:29 +0200] "GET /news/article/53f00d5efeb89844977b5477 HTTP/1.1" 499 0 "http://www.myserver.com/news/article/53f00d5efeb89844977b5477" "Mozilla/5.0 (iphone; U; CPU iPhone OS 4_3_5 like Mac OS X; en-US) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5”

Java应用程序日志:

2014-08-20 22:30:29,621 INFO  application - Activity  - IP: 222.72.xxx.xxx, 10.210.44.35, 115.239.xxx.x, URL: /news/article/53f00d5efeb89844977b5477, UserAgent: Mozilla/5.0 (iphone; U; CPU iPhone OS 4_3_5 like Mac OS X; en-US) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5

顺便说一下,服务器也支持IPV6,这就是为什么我在nginx.conf中添加了IPv6支持。

有人能帮帮我吗?

非常感谢!

祝好,

Martin

1个回答

4

Play框架中有一个配置选项,控制是否信任Nginx发送的X-Forwarded-For头信息。您需要添加以下代码:

trustxforwarded=true

你是否已经将内容添加到application.conf中了?

在“高级代理设置”标题下的文档中有详细说明:https://www.playframework.com/documentation/2.3.x/HTTPServer


嗨Rich,非常感谢!它起作用了!现在我不再像在Java中一样获得IP 0:0:0:0:0:0:0:1。但有时候似乎我仍然会在Java中获得多个IP地址。我还没有弄清原因。此外,有时客户端的cookie似乎没有从nginx传递到Playframework应用程序。 - Martin
X-Forwarded-For 头可以包含来自多个代理的信息,但您应该只信任最后一个值。请参见:http://en.wikipedia.org/wiki/X-Forwarded-For#Format关于 cookies 不确定。您可能需要提供更多信息并创建一个新问题。 - Rich Dougherty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接