明白了,所以这更多是关于 Rails 或其他 gem 如何处理 headers,而不是 Discourse 代码本身的行为。
有趣的是,Rails 并没有使用 X-Real-IP,它可能不如 X-Forwarded-For 常用,但肯定比 Forwarded 和 Client-IP 更为人熟知
。
那么 X-Real-IP 在 Nginx 配置中可能已经过时了。如果我的理解正确的话,Discourse 在日志中会同时使用 X-Real-IP 和 X-Forwarded-For 来扩展记录?我在代码中没有找到其他显式的使用或提及:
- discourse/lib/discourse_logstash_logger.rb at main · discourse/discourse · GitHub
- logster/lib/logster/message.rb at main · discourse/logster · GitHub
我在调试共享速率限制并记录关于无效“unix:”客户端 IP 的错误时,看到下面的配置觉得有两处不对劲(我们在容器前面使用了 UNIX socket 代理,并且依赖 X-Forwarded-For):
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
但我理解让 $remote_addr 成为唯一的真实来源,并通过 real_ip_header 作为管理员控制 Discourse/Rails 获取单个 IP 的标准方式,确实能“正常工作”。我看到这个方案已经在 Serve Discourse from a subfolder (path prefix) instead of a subdomain 中被添加进来了
。