让 Tomcat 使用 X-Real-IP

Ker*_*erb 10 tomcat nginx

我在 Tomcat 7 前面将 nginx 配置为反向代理。我在 nginx 配置中添加了以下几行:

set_real_ip_from 127.0.0.1;
...
location / {
    proxy_pass http://tomcat;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
Run Code Online (Sandbox Code Playgroud)

但是,我仍然在 Tomcat 日志中看到以下图片:

127.0.0.1 - - [10/Jun/2013:11:25:48 +0600] "GET /app/welcome;jsessionid=6C1B02376C5F748C509B28FC7CE416C9 HTTP/1.0" 200 10571
127.0.0.1 - - [10/Jun/2013:11:25:48 +0600] "GET /app/welcome;jsessionid=0BBE0174C1F0E94FDF49610144E809D3 HTTP/1.0" 200 10571
127.0.0.1 - - [10/Jun/2013:11:25:48 +0600] "GET /app/welcome;jsessionid=AD48005AD453F3A0BE46F1AC978F145D HTTP/1.0" 200 10571
Run Code Online (Sandbox Code Playgroud)

有没有办法强制 Tomcat 使用 X-Real-IP 标头(并将其写入日志文件)而不修改Web 应用程序?

Ker*_*erb 15

需要在Tomcat配置中添加Valve:

<Valve className="org.apache.catalina.valves.RemoteIpValve"
               remoteIpHeader="X-Forwarded-For"
               requestAttributesEnabled="true"
               internalProxies="127\.0\.0\.1"  />
Run Code Online (Sandbox Code Playgroud)

之后 Tomcat 开始分派从 nginx 传递过来的标头:

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
Run Code Online (Sandbox Code Playgroud)

  • 根据 [文档](https://tomcat.apache.org/tomcat-8.0-doc/api/org/apache/catalina/valves/RemoteIpValve.html),`internalProxies` 需要一个正则表达式,而不是一个字符串文字。因此,`127.0.0.1` 应该是 `127\.0\.0\.1`。 (5认同)

小智 5

通过谷歌找到这个问题,并想在批准的答案中添加评论:

根据文档,默认情况下,此阀 (RemoteIpValve) 对写入访问日志的值没有影响。为了在日志中获得真实的 IP,您应该添加

requestAttributesEnabled="true"
Run Code Online (Sandbox Code Playgroud)

也到 AccessLogValve。