# 代理背后的 Express
在反向代理后面运行 Express 应用程序时,某些 Express API 可能返回与预期不同的值。为了对此进行调整,trust proxy
应用程序设置可用于公开由 Express API 中的反向代理提供的信息。最常见的问题是公开客户端 IP 地址的快速 API 可能会显示反向代理的内部 IP 地址。
配置 trust proxy 设置时,了解反向代理的确切设置非常重要。由于此设置将信任请求中提供的值,因此 Express 中的设置组合与反向代理的操作方式相匹配非常重要。
应用程序设置 trust proxy
可以设置为下表中列出的值之一。
# 布尔值
如果是 true,则客户端的 IP 地址被理解为 X-Forwarded-For 标头中最左边的条目。
如果是false,则应用理解为直接面向客户端,客户端的IP地址来源于req.socket.remoteAddress。这是默认设置。
设置为 true 时,务必确保最后一个受信任的反向代理正在删除/覆盖以下所有 HTTP 标头:X-Forwarded-For、X-Forwarded-Host 和 X-Forwarded-Proto,否则客户端可能提供任何值。
# IP 地址
一个 IP 地址、子网或一组 IP 地址和子网,可作为反向代理信任。以下列表显示了预配置的子网名称:
loopback - 127.0.0.1/8,::1/128
linklocal - 169.254.0.0/16,fe80::/10
uniquelocal - 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、fc00::/7
您可以通过以下任一方式设置 IP 地址:
app.set('trust proxy', 'loopback') // specify a single subnet
app.set('trust proxy', 'loopback, 123.123.123.123') // specify a subnet and an address
app.set('trust proxy', 'loopback, linklocal, uniquelocal') // specify multiple subnets as CSV
app.set('trust proxy', ['loopback', 'linklocal', 'uniquelocal']) // specify multiple subnets as an array
指定时,IP 地址或子网将被排除在地址确定过程之外,并将离应用服务器最近的不受信任的 IP 地址确定为客户端的 IP 地址。这通过检查 req.socket.remoteAddress 是否受信任来工作。如果是这样,则从右到左检查 X-Forwarded-For 中的每个地址,直到第一个不受信任的地址。
# 数字
使用距离 Express 应用程序最多 n 跳数的地址。req.socket.remoteAddress 是第一跳,其余的在 X-Forwarded-For 标头中从右到左查找。0 的值意味着第一个不受信任的地址将是 req.socket.remoteAddress,即没有反向代理。
使用此设置时,重要的是要确保 Express 应用程序没有多个不同长度的路径,以便客户端可以少于配置的跳数,否则客户端可能会提供任何值.
# 函数
自定义信任实现。
app.set('trust proxy', (ip) => {
if (ip === '127.0.0.1' || ip === '123.123.123.123') return true // trusted IPs
else return false
})
启用 trust proxy
将产生以下影响:
req.hostname
的值来源于X-Forwarded-Host
头中设置的值,可以由客户端设置,也可以由代理设置。X-Forwarded-Proto
可以通过反向代理来告诉app
是https
还是http
,甚至是一个无效的名字。该值由req.protocol
反映。req.ip
和req.ips
值是根据套接字地址和X-Forwarded-For
标头填充的,从第一个不受信任的地址开始。
trust proxy
设置是使用 proxy-addr
包实现的。有关更多信息,请参阅其文档。
← 调试 迁移到 Express 4 →