Следование относительному перенаправлению через прокси
Разрешите относительный Location относительно текущего целевого URL, не включая адрес прокси в разрешение URL.
Ответ, полученный через прокси, может вернуть относительный 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 или к соединению, предпринятому после.