Ett svar som tas emot via en proxy kan returnera en relativ Location:

Location: ../new/

Modern HTTP tillåter en URI-referens här. Lös upp den mot URL:en som producerade svaret. Om den URL:en var https://docs.example/catalog/old/, identifierar referensen ovan https://docs.example/catalog/new/. Proxyns värdnamn är inte basen.

För vanliga Python urllib-förfrågningar använder du dess omdirigeringshanterare i stället för att sammanfoga strängar runt proxyns slutpunkt:

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()

För denna förfrågan om ett offentligt dokument utan proxyautentisering kan en HTTP-kandidat från HTTP-proxylistan ersätta exempelslutpunkten när rutten är tillåten. Klasserna kommer från urllib.request. Dess normala hanterare följer stödda omdirigeringar inom sina gränser. final_url beskriver resursens slutliga URL, inte mellanhanden som användes för att nå den.

Lös upp först, välj sedan nästa rutt

En omdirigering kan ändra målvärden eller schema. En destinationsbaserad proxyprincip måste därför också utvärdera den nya URL:en. En rutt som fungerade för den första värden är kanske inte rutten för nästa.

När du själv implementerar hantering av omdirigeringar, använd URI-referensupplösning med hantering av punktsegment. Behåll metodreglerna för den faktiska statuskoden och inför en omdirigeringsgräns. Att lägga till Location till ett värdnamn ersätter inte den upplösningsalgoritmen.

Om en omdirigering misslyckas, behåll den begärda URL:en, svarsstatusen, Location-värdet och den upplösta nästa URL:en. Dessa fyra värden visar vanligtvis om felet hör till URL-konstruktionen eller till anslutningen som försöktes efteråt.

Relaterade artiklar