когда HTTP-клиент отправляет GET
запрос, имя хоста назначения обычно не в URI. То есть вместо отправки
GET http://www.gstatic.com/generate_204 HTTP/1.1
клиент HTTP 1.1 отправляет:
GET /generate_204 HTTP/1.1
Host: www.gstatic.com
так как клиент "знает", что ему нужно разрешить DNS-имя "www.gstatic.com" на IP-адрес, и отправить HTTP-запрос на этот IP-адрес, на самом деле не нужно включать имя хоста снова в рамках запрошенный путь. The Host
заголовок является подсказкой к серверу первоначально запрошенного имени хоста.
обратите внимание, что вышеупомянутые семантики покрыты RFC 7230, раздел 5.3. А там, it тут укажите, что "абсолютная форма" запрашиваемого / целевого ресурса может включите схему и имя хоста; это "исходная форма", которую я описал выше. Если ваш сервер отправления / назначения возвращает "400 неверных запросов" для " абсолютной формы" то, что использует ваш прокси, предполагает либо a) этот сервер не поддерживает "абсолютную форму" или b) что-то не так (отсутствует Host
заголовка запроса?).
это означает, что ваш HTTP прокси не должен действительно полагаться на имя хоста назначения, находящегося в первой строке HTTP-запроса (для HTTP client может используйте "исходную форму" запрашиваемого / целевого ресурса; вместо этого ваш прокси должен искать Host
заголовок, Если вам нужно знать эту информацию. И чтобы избежать 400 Bad Request
от сервера происхождения, я рекомендую, чтобы ваш прокси отправить например:
GET /generate_204 HTTP/1.1
Host: www.gstatic.com
на содержание CONNECT
метод, см. RFC 7231, раздел 4.3.6. Там мы видим, что запрашиваемый ресурс должны состоит из имени хоста и порта. Любой 2xx
ответ от сервера назначения указывает на успех; любой другой код ответа указывает, что запрашиваемые "туннель" не настроен. Остальная часть RFC там стоит прочитать для других крайних случаев и поведения.
надеюсь, что это помогает!