Понял, так что дело больше в том, как Rails или другие гемы обрабатывают заголовки, а не в том, что делает код Discourse.
Интересно, что Rails не использует X-Real-IP, который, вероятно, встречается реже, чем X-Forwarded-For, но определённо более известен, чем Forwarded и Client-IP
.
Возможно, X-Real-IP теперь устарел в конфигурации Nginx. Discourse использует его вместе с X-Forwarded-For в логах, если я правильно понимаю? Я не нашёл других явных упоминаний или использования в коде:
- discourse/lib/discourse_logstash_logger.rb at main · discourse/discourse · GitHub
- logster/lib/logster/message.rb at main · discourse/logster · GitHub
Нижеприведённый фрагмент выглядел неверным по двум причинам, когда я наткнулся на него при отладке общей ограничения частоты запросов (rate limiting) и записывал ошибки о невалидном IP-адресе клиента «unix:» после обновления нашего Discourse (мы используем прокси через UNIX-сокет перед контейнером и полагаемся на X-Forwarded-For).
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
Но я понимаю аргумент «это работает», чтобы надёжно сделать $remote_addr единственным источником истины, а real_ip_header — каноническим способом для администраторов контролировать единственный IP-адрес, который получает Discourse/Rails. Вижу, что это уже было добавлено в Serve Discourse from a subfolder (path prefix) instead of a subdomain
.