鍍金池/ 教程/ HTML/ 代理之后的 Express
在 Express 中使用模板引擎
代理之后的 Express
使用中間件
數(shù)據(jù)庫集成
錯(cuò)誤處理
調(diào)試 Express
路由
遷移到 Express 4

代理之后的 Express

當(dāng)在代理服務(wù)器之后運(yùn)行 Express 時(shí),請(qǐng)將應(yīng)用變量 trust proxy 設(shè)置(使用 app.set())為下述列表中的一項(xiàng)。

如果沒有設(shè)置應(yīng)用變量 trust proxy,應(yīng)用將不會(huì)運(yùn)行,除非 trust proxy 設(shè)置正確,否則應(yīng)用會(huì)誤將代理服務(wù)器的 IP 地址注冊(cè)為客戶端 IP 地址。

類型 Value
Boolean

如果為 true,客戶端 IP 地址為 X-Forwarded-* 頭最左邊的項(xiàng)。

如果為 false, 應(yīng)用直接面向互聯(lián)網(wǎng),客戶端 IP 地址從 req.connection.remoteAddress 得來,這是默認(rèn)的設(shè)置。

IP 地址

IP 地址、子網(wǎng)或 IP 地址數(shù)組和可信的子網(wǎng)。下面是預(yù)配置的子網(wǎng)列表。

  • 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

使用如下方式設(shè)置 IP 地址:

app.set('trust proxy', 'loopback') // 指定唯一子網(wǎng)
app.set('trust proxy', 'loopback, 123.123.123.123') // 指定子網(wǎng)和 IP 地址
app.set('trust proxy', 'loopback, linklocal, uniquelocal') // 指定多個(gè)子網(wǎng)
app.set('trust proxy', ['loopback', 'linklocal', 'uniquelocal']) // 使用數(shù)組指定多個(gè)子網(wǎng)

當(dāng)指定地址時(shí),IP 地址或子網(wǎng)從地址確定過程中被除去,離應(yīng)用服務(wù)器最近的非受信 IP 地址被當(dāng)作客戶端 IP 地址。

數(shù)字

將代理服務(wù)器前第 n 跳當(dāng)作客戶端。

函數(shù)

定制實(shí)現(xiàn),只有在您知道自己在干什么時(shí)才能這樣做。

app.set('trust proxy', function (ip) {
  if (ip === '127.0.0.1' || ip === '123.123.123.123') return true; // 受信的 IP 地址
  else return false;
})

設(shè)置 trust proxy 為非假值會(huì)帶來兩個(gè)重要變化:

  • 反向代理可能設(shè)置 X-Forwarded-Proto 來告訴應(yīng)用使用 https 或簡單的 http 協(xié)議。請(qǐng)參考 req.protocol
  • req.ipreq.ips 的值將會(huì)由 X-Forwarded-For 中列出的 IP 地址構(gòu)成。

trust proxy 設(shè)置由 proxy-addr 軟件包實(shí)現(xiàn),請(qǐng)參考其文檔了解更多信息。