通过代理跟随相对重定向
依据当前目标 URL 解析相对 Location,避免把代理地址带入 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 构造还是随后尝试的连接。