프록시를 통한 상대 리디렉션 따라가기
상대 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 구성에 속하는지 아니면 그 뒤에 시도한 연결에 속하는지를 보여줍니다.