Express за прокси-серверами
При запуске приложения Express за обратным прокси-сервером некоторые API Express могут возвращать значения, отличные от ожидаемых. Для корректировки этого можно использовать настройку приложения trust proxy, чтобы предоставить информацию, полученную от обратного прокси-сервера, в API Express. Наиболее распространённая проблема заключается в том, что API Express, которые отображают IP-адрес клиента, вместо этого могут показывать внутренний IP-адрес обратного прокси-сервера.
При настройке параметра trust proxy, важно понимать точную настройку обратного прокси-сервера. Поскольку эта настройка будет доверять значениям, предоставленным в запросе, важно, чтобы сочетание настройки в Express соответствовало тому, как работает обратный прокси-сервер.
Параметр приложения trust proxy может быть установлен на одно из значений, перечисленных в следующей таблице.
| Тип | Значение |
|---|---|
| Булево | Если Если При установке значения |
| IP-адреса | 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
При указании IP-адресов или подсетей они исключаются из процесса определения адреса, и как IP-адрес клиента определяется ближайший к серверу приложения недоверенный IP-адрес. Это работает путём проверки, является ли |
| Число | Используется адрес, который находится не более чем на При использовании этой настройки важно убедиться, что нет нескольких путей разной длины к приложению 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может быть установлено обратным прокси-сервером, чтобы сообщить приложению, является ли оноhttpsилиhttp, или даже недействительным именем. Это значение отражается в req.protocol. -
Значения req.ip и req.ips заполняются на основе адреса сокета и заголовка
X-Forwarded-For, начиная с первого недоверенного адреса.
Настройка trust proxy реализована с использованием пакета proxy-addr. Более подробную информацию см. в его документации.
© 2017 StrongLoop, IBM, and other expressjs.com contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v3.0.
https://expressjs.com/en/guide/behind-proxies.html