「HTTP」- 与反向代理有关的头部(学习笔记)

  CREATED BY JENKINSBOT

问题描述

在配置 Nginx 反向代理时,我们经常被 X-REAL-IP、X-Forwarded-For 等等头部,搞得晕头转向。再比如,在多层反向代理环境中,传递客户端真实网络地址的问题。

该笔记将记录:学习与 HTTP 反向代理有关的头部。

解决方案

Forwarded

透露“通过代理连接服务器的”客户端的原始信息。

例如:Forwarded: for=192.0.2.60;proto=http;by=203.0.113.43

X-Forwarded-For

标识“通过代理或者负载均衡连接到服务器的”客户端原始网络地址。(被 Forwarded 标头取代,但依旧在使用)

例如:X-Forwarded-For: client1, proxy1, proxy2 / X-Forwarded-For: 129.78.138.66, 129.78.64.103

X-Forwarded-Host

标识客户端请求的原始主机(头部 Host 字段)。因为代理或者负载均衡可能使用不同的主机,比如多级代理转发。(被 Forwarded 标头取代,但依旧在使用)

例如:X-Forwarded-Host: en.wikipedia.org:8080 / X-Forwarded-Host: en.wikipedia.org

X-Forwarded-Proto

标识客户端请求的原始协议,因为代理服务器可能用 HTTP 请求目标服务器,即使原始请求使用 HTTPS 协议。(被 Forwarded 标头取代,但依旧在使用)

例如:X-Forwarded-Proto: https

Max-Forwards

限制消息可通过代理转发的最大次数。

例如:Max-Forwards: 10

X-REAL-IP

在 RFC 中,我们没有看到 X-REAL-IP 头部的说明,但是其他文档中提到,该字段记录客户端的真实网络地址。

例如:X-Real-IP: 192.168.0.10

附加说明

客户端能够随意构建这些请求头的信息。如果客户端使用虚假的 X-Forwarded-For 等头部,并且服务端没有严格检查,则完全能够绕过网络地址限制,以任意设置客户端地址。

相关链接

在 Nginx 中,调试并获取客户端真实地址

参考文献

List of HTTP header fields
HTTP “X-” Headers
Is sending “X-Real-IP” and “X-Forwarded-For” necessary for an Nginx cache running on LAN? – Server Fault