【问题标题】:Why doesn't Invoke-WebRequest follow redirect when ran from catch block为什么从 catch 块运行时 Invoke-WebRequest 不遵循重定向
【发布时间】:2019-07-27 00:14:10
【问题描述】:

我在 Mac OS X 10.14.5 上的 PowerShell Core v6.1.0 上运行代码。

我有一个网站列表,我正在尝试使用 Invoke-WebRequest 进行验证。假设该列表包含以下网站

 http://www.google.com
 http://www.microsoft.com
 http://www.hp.com
 https://go.microsoft.com/fwlink/?LinkID=835028 http://samanage.bz
 http://samanage.agency

如果我使用下面的代码来验证网站是否可以访问,那么一切正常。

$sites = Get-Content ./Sites.txt

    foreach ($site in $sites){
    $request = Invoke-Webrequest $site
    Write-Host "Status for $site is $($request.StatusDescription)."
}

在检查每个网站是否有效后,我想看看这些网站是否被重定向到某个地方,所以我添加了 try/catch 并将最大重定向限制为 0

$sites = Get-Content ./Sites.txt

foreach ($site in $sites){

    try{
        $request = Invoke-WebRequest $site -MaximumRedirection 0
        $siteStatus = $request.StatusDescription
    }

    catch{
        Write-Host "$site is being redirected"
        $request = Invoke-WebRequest $site -Method HEAD

        # I actually use regex to pull out the destination site
        # from the Headers.Link attribute, but left it out for
        # simplicity

        $siteStatus = $request.Headers.Link
    }

    Write-Host "Status for $site is $siteStatus."
}

预期任何使用重定向的网站的第一个请求都会失败并被捕获到 catch 块中。然后请求将在没有重定向限制的情况下重新运行,并且可以从 Headers.Link 中提取重定向目标。

前四个条目的代码工作正常,但后两个没有正确遵循重定向,而是导致此错误:

Invoke-WebRequest : 响应状态码不表示成功:302(找到)

我已经尝试询问 Google,但没有发现当我在 catch 块中运行 Invoke-WebRequest 时会给出不同的结果。

有人知道是什么原因造成的吗?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    302 是重定向状态,因此您似乎再次被重定向。 -MaximumRedirection 的默认值为5;是否有可能发生超过 5 个重定向?也许是无限重定向循环?您可以先尝试将数字设置得更高。您还可以在catch 中添加检查以比较$site$siteStatus 是否相同,但您必须确定URL 的哪些部分算作相同或不同(仅主机名、路径、查询、方案、斜杠等)。转换为 [uri] 以便您获得一些预填充的属性可能也会有所帮助。

    【讨论】:

    • 感谢您的建议。我实际上认为这可能是由于重定向超过 5 跳造成的,这就是为什么我在没有 try/catch 的情况下测试网站的原因。没有错误处理,所有网站都可以正常解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 2013-04-29
    • 2017-02-16
    相关资源
    最近更新 更多