Поведение HTTP X-Forwarded-Host без порта - PullRequest
1 голос
/ 25 апреля 2020

Я обнаружил, что X-Forwarded-Host HTTP-заголовок не очень хорошо определен в случае портов. Возможно, именно поэтому различные реализации ведут себя по-разному, когда дело доходит до этого заголовка. Обычно этот заголовок может содержать порт, например, b.com:123, что просто. Но что, если он NOT содержит порт, а сервер работает не по умолчанию? После небольшого исследования я обнаружил, что некоторые реализации вводят «неофициальный» заголовок X-Forwarded-Port.

Сейчас я думаю о реализации на сервере и думаю, что если заголовок X-Forwarded-Host присутствует без порта, то выходные URL-адреса должны , а не содержать порт, даже если сервер работает на порте, отличном от порта по умолчанию (если заголовок X-Forwarded-Port отсутствует).

Ситуация ухудшается при наличии заголовка X-Forwarded-Proto.

Я создал простой таблица, описывающая, как я могу ожидать, что сервер будет вести себя, и мой вопрос:

Будете ли вы реализовать его так же? Является ли объявленное поведение интуитивно понятным для вас? Заранее спасибо.

| # |       Request        | X-F...-Proto | X-F...-Host | X-F...-Port |      Output URL      |
|:-:|:---------------------|:------------:|:-----------:|:-----------:|:---------------------|
| 1 | http://a.com:8080/x  |     -no-     |     -no-    |    -no-     | http://a.com:8080/x  |
| 2 | http://a.com:8080/x  |    https     |     -no-    |    -no-     | https://a.com:8080/x |
| 3 | http://a.com:8080/x  |     -no-     |    b.com    |    -no-     | http://b.com/x       |
| 4 | http://a.com:8080/x  |     -no-     |  b.com:123  |    -no-     | http://b.com:123/x   |
| 5 | http://a.com:8080/x  |     -no-     |     -no-    |     123     | http://a.com:123/x   |
| 6 | http://a.com:8080/x  |     -no-     |    b.com    |     123     | http://b.com:123/x   |
| 7 | http://a.com:8080/x  |     -no-     |  b.com:123  |    -no-     | http://b.com:123/x   |
| 8 | http://a.com:8080/x  |     -no-     |  b.com:123  |     456     | http://b.com:456/x   |
| 9 | http://a.com:8080/x  |    https     |    b.com    |    -no-     | https://b.com/x      |
|10 | http://a.com:8080/x  |    https     |    b.com    |     123     | https://b.com:123/x  |
|11 | xyzz://a.com:8080/x  |     -no-     |    b.com    |    -no-     | xyzz://b.com:8080/x  |

Обратите внимание на № 3 и № 9, которые, на мой взгляд, самые хитрые.

1 Ответ

0 голосов
/ 27 апреля 2020

Поскольку ответа пока нет, я спросил нескольких человек из нашей компании, которые занимаются инфраструктурой и веб-серверами, и они согласились, что предлагаемое решение (таблица) является правильным. Так что:

  • X-Forwarded-Host без порта означает использовать протокол по умолчанию (80, 443)

На случай, если кто-то заинтересован в коде (Java) = здесь запрос на получение (PR) к Gravitee.io Платформа управления API, которая фиксирует поведение от использования порта приложения по умолчанию (8083) до портов протокола по умолчанию (80 , 443) и добавляет поддержку X-Forwarded-Port.

...