X-Forwarded-For
、X-Original-Forwarded-For
和 X-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;