X-Forwarded-ForX-Original-Forwarded-ForX-Real-IP 都是 HTTP 请求头部字段,用于记录客户端的原始 IP 地址。它们在处理通过代理服务器或负载均衡器的请求时具有重要作用。

  • X-Forwarded-For:当请求经过代理服务器时,每个服务器都会将其 IP 地址添加到此字段。如果有 n 个 IP 地址,通常表示请求经过了 n-1 个代理服务器。但这个字段可能被篡改,因此不一定完全可靠。

  • X-Original-Forwarded-For:通常用于存储 X-Forwarded-For 的初始值,以防在传递过程中被修改。但如果 X-Forwarded-For 被篡改,该字段的值也可能出错。

  • X-Real-IP:记录客户端的原始 IP 地址,通常只包含一个 IP 地址,更适合只需要知道客户端原始 IP 而不需要知道完整请求路径的情况。虽然它通常由接收请求的第一个代理服务器设置,但也可能被篡改。

总的来说,这些字段提供了有关请求来源和路径的有用信息,但由于可能被篡改,因此在使用时需要谨慎。在某些情况下,可能需要使用更安全的方法来确定请求的真实来源,例如使用 TLS 客户端证书或进行 IP 地址的身份验证。

$host$http_host

  • $host不包含端口号,而$http_host包括。
  • 如果客户端请求中没有Host请求头,$http_host将会是空值,而$host将会被设置为代理服务器的IP地址或者域名。

Nginx 的 $http_ 变量是一种内置的、隐含的功能,用于访问 HTTP 请求头。Nginx 可以使用 $http_ 前缀来访问 HTTP 请求头的值。例如,$http_x_real_ip 变量将包含 X-Real-Ip 请求头的值。这是 Nginx 的一个内置功能,虽然在 Nginx 的官方文档中可能没有明确说明,但它是被广泛使用的。 对于任何 HTTP 请求头,都可以通过在请求头的名称前面添加 $http_ 前缀,并将名称转换为小写形式,然后把所有的短横线 - 替换为下划线 _,来创建一个变量。例如,User-Agent 请求头可以被访问为 $http_user_agent,Accept-Encoding 请求头可以被访问为 $http_accept_encoding,等等。


说明:这部分有个坑,自定义请求头中的key值不能带下划线_;配置允许请求头信息在NGINX配置文件中加入如下配置即可。

underscores_in_headers on;