第22行的 express,返回的是一个 express Application 实例。
再看该实例的 set 方法:
app.set(name, value)
将设置名称分配给值。 您可以存储您想要的任何值,但某些名称可用于配置服务器的行为。 这些特殊名称列在应用程序设置表中。
为布尔属性调用 app.set(‘foo’, true) 与调用 app.enable(‘foo’) 相同。 同样,为布尔属性调用 app.set(‘foo’, false) 与调用 app.disable(‘foo’) 相同。
使用 app.get() 检索设置的值。
Express behind proxies
在反向代理后面运行 Express 应用程序时,某些 Express API 可能返回与预期不同的值。 为了对此进行调整,可以使用 trust proxy 应用程序设置来公开 Express API 中反向代理提供的信息。
最常见的问题是公开客户端 IP 地址的 express API 可能会显示反向代理的内部 IP 地址。这并不是我们期望的。
server.set('trust proxy', 'loopback');
- 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
trust proxy 的属性可以设置成以下几种类型:
设置成 boolean
如果为 true,则客户端的 IP 地址被理解为 X-Forwarded-For 标头中最左侧的条目。
如果为 false,则应用程序被理解为直接面向客户端,并且客户端的 IP 地址来自 req.socket.remoteAddress。 这是默认设置。
设置为 true 时,确保最后一个受信任的反向代理删除/覆盖以下所有 HTTP 标头很重要:X-Forwarded-For、X-Forwarded-Host 和 X-Forwarded-Proto,否则的话,客户可能为这几个字段提供任何价值。
设置成 ip 地址
作为反向代理信任的 IP 地址、子网或一组 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
- 2
- 3
- 4
指定时,IP 地址或子网将被排除在地址确定过程之外,并且离应用服务器最近的不受信任的 IP 地址被确定为客户端的 IP 地址。 这通过检查 req.socket.remoteAddress 是否可信来工作。 如果是,则从右到左检查 X-Forwarded-For 中的每个地址,直到第一个不可信地址。
启用信任代理将产生以下影响:
-
req.hostname 的值来自 X-Forwarded-Host 头中设置的值,可以由客户端或代理设置。
-
X-Forwarded-Proto 可以由反向代理设置来告诉应用程序是 https 还是 http 甚至是无效名称。 该值由 req.protocol 反映。
-
req.ip 和 req.ips 值基于套接字地址和 X-Forwarded-For 标头填充,从第一个不受信任的地址开始。
更多Jerry的原创文章,尽在:“汪子熙”: