Powershell: Invoke-WebRequest aborts with httpcode 301/308 permanent redirect

Hi,

the powershell command-let Invoke-WebRequest does not follow an http redirect.

The solution is to call Invoke-WebRequest recursivly with the redirect URL from the location header field when http code 301 or 308 is returned.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
$sRedirectTo=$null
do {
    $oWebResponse = $null
    try
    {
        $oWebResponse = Invoke-WebRequest $sURL
    }
    catch
    {
        $oWebResponse=$_.Exception.Response
        write-host ("Exception: {0}" -f $_.Exception.Message)
    }
    if($oWebResponse.StatusCode -ne 200)
    {
        $aRedirectTo=$oWebResponse.Headers.GetValues("location")
        if($aRedirectTo.Count -ge 1)
        {
            $sRedirectTo=$aRedirectTo[0]
        }
        else
        {
            write-host ("No location URL in header")
            break
        }
        if (-not [string]::IsNullOrEmpty($sRedirectTo))
        {
            write-host ("Redirect to {0}" -f ($sRedirectTo))
            $sURL = $sRedirectTo
        }
        else
        {
            write-host ("location URL Null")
            break
        }
    }
    else
    {
        Write-Output ("OK Location = {1} HttpCode = {0}" -f $oWebResponse.StatusCode,$sRedirectTo )
        break
    }
     
}
while ($true)

Michael

Leave a Reply