Ответ, полученный через прокси, может вернуть относительный Location:

Location: ../new/

Современный HTTP допускает здесь ссылку URI. Разрешите её относительно URL, создавшего ответ. Если этим URL был https://docs.example/catalog/old/, ссылка выше указывает на https://docs.example/catalog/new/. Имя хоста прокси не является базой.

Для обычных запросов Python urllib используйте его обработчик перенаправлений, а не склеивайте строки вокруг конечной точки прокси:

opener = build_opener(ProxyHandler({
    "https": "http://proxy.example:8080",
}))
with opener.open("https://docs.example/catalog/old/",
                 timeout=15) as response:
    final_url = response.geturl()

Для этого запроса публичного документа без аутентификации прокси HTTP-кандидат из списка HTTP-прокси может заменить пример конечной точки, если маршрут разрешён. Классы происходят из urllib.request. Его обычный обработчик следует поддерживаемым перенаправлениям в своих пределах. final_url описывает итоговый URL ресурса, а не посредника, использованного для его достижения.

Сначала разрешите, затем выбирайте следующий маршрут

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

Если вы сами реализуете обработку перенаправлений, используйте разрешение ссылок URI с обработкой точечных сегментов. Сохраняйте правила метода фактического кода состояния и задайте предел перенаправлений. Добавление Location к имени хоста не заменяет этот алгоритм разрешения.

Если перенаправление не удалось, сохраните запрошенный URL, статус ответа, значение Location и разрешённый следующий URL. Эти четыре значения обычно показывают, относится ли сбой к построению URL или к соединению, предпринятому после.

Похожие статьи