Как правильно отобразить абсолютные URL-адреса за обратным прокси-сервером? - PullRequest
0 голосов
/ 26 октября 2019

У меня есть веб-приложение, работающее на сервере (скажем, на localhost:8000) за обратным прокси-сервером на том же сервере (на myserver.example:80). Из-за того, как работает обратный прокси-сервер, приложение видит входящий запрос, нацеленный на localhost:8000, и поэтому используемая среда пытается генерировать абсолютные URL-адреса, которые выглядят как localhost:8000/some/ressource вместо myserver.example/some/ressource.

* 1007. * Каков будет «правильный способ» создания абсолютного URL (а именно, определение имени хоста для использования) из-за такого прокси-сервера? Конкретный прокси-сервер, инфраструктура и язык не имеют значения, я имею в виду это больше в смысле HTTP.

Из моего первоначального исследования:

  • RFC7230 явноговорит , что прокси-серверы ДОЛЖНЫ изменить заголовок Host при передаче запроса, чтобы он выглядел так, как если бы запрос поступил от них, поэтому было бы похоже на использование Host для определения имени хоста для URL, но вВ большинстве мест, где я смотрел, общий совет, похоже, заключается в том, чтобы настроить обратный прокси-сервер таким образом, чтобы он не изменял заголовок Host (против спецификации) при передаче запроса.
  • RFC7230 также говорит что «запрос на восстановление URI» должен использовать следующие поля, чтобы найти, какой «компонент полномочий» использовать, хотя, похоже, это применимо только с точки зрения агента, отправившего этот запрос, такого какпрокси:
  • Фиксированный компонент полномочий URI от сервера или конфигурации исходящего шлюза
  • Компонент полномочий от thЗапросить первую строку, если это полный URI, а не путь
  • Заголовок хоста, если он присутствует, а не пустой
  • Адрес прослушивания или имя хоста, а также номер входящего порта, если это непо умолчанию для протокола
  • HTTP 1.0 вообще не было заголовка Host, и этот заголовок был добавлен для целей маршрутизации, а не для разрешения полномочий URL.
  • Существуют заголовки, которыесделаны специально для того, чтобы позволить прокси отправлять старое значение Host после маршрутизации, такое как Via, Forwarded и неофициальное X-Forwarded-Host, которые будут проверять некоторые серверы и фреймворки, но не все, и неясно, какой из них должен даже иметь приоритет, учитывая, что их 3.

РЕДАКТИРОВАТЬ: Я также не знаю, будет ли HTTPSработать в этом отношении иначе, учитывая, что заголовки являются частью зашифрованной полезной нагрузки, и маршрутизация должна выполняться другим способом из-за этого .

1 Ответ

0 голосов
/ 26 октября 2019

В общем, я считаю, что лучше установить реальный хост и порт явно в приложении, а не пытаться угадать их из входящего запроса.

Так, например, Jira позволяет вам установить BaseURL, через который будет доступен Jira (который может отличаться от того, с которым он фактически запускается). Это означает, что вы можете использовать Jira на порте 8080 и иметь Apache или Nginx перед ним (на том же или даже другом сервере) на портах 80 и 443.

...