使 wget 在 3XX 重定向后重试原始 URL

Posted

技术标签:

【中文标题】使 wget 在 3XX 重定向后重试原始 URL【英文标题】:Make wget retry original URL after 3XX Redirect 【发布时间】:2016-11-11 10:42:11 【问题描述】:

我有一项服务可以将用户重定向到临时预签名 AWS 下载。这些是大文件,通常为 5-10GB。为了防止下载共享,我们有一个相对较短(30 秒)的有效生命周期。

一切正常,除了在互联网连接速度较慢时,它们往往会失败或被中断。 wget 具有自动重试下载的功能。但是,wget 不会重试原始 URL(例如:http://service.com/download/file.zip),而是重试重定向的预签名 URL(例如:http://service.s3.amazonaws.com/file.zip?AWSAccessKeyId=XXXX&Signature=XXXX&Expires=1468000000)

由于这些文件很大,而且预签名的生命周期很短,因此临时 url 不再有效,用户会收到 403 Forbidden 结果。

最初,当我们注意到这个问题时,我们使用的是 302 Found 临时重定向。一项小研究似乎表明我们应该一直使用 307 临时重定向。但是,这并没有解决 wget 的问题。我们尝试了 303 See Other,但也不管用。

有谁知道如何让 wget 重试原始 URL 而不是重定向的 URL?

以下是 wget 示例日志:

--2016-07-06 10:29:51-- https://service.com/download/file.zip

正在连接到 service.com (service.com)|10.0.0.1|:443... 已连接。

HTTP 请求已发送,等待响应... 302 Found

地点: https://service.s3.amazonaws.com/file.zip?AWSAccessKeyId=XXXX&Signature=XXXX&Expires=1468000000 [关注]

--2016-07-06 10:29:52-- https://service.s3.amazonaws.com/file.zip?AWSAccessKeyId=XXXX&Signature=XXXX&Expires=1468000000

正在解析 service.s3.amazonaws.com (service.s3.amazonaws.com)... 54.231.12.129

连接到 service.s3.amazonaws.com (service.s3.amazonaws.com)|54.231.12.129|:443... 已连接。

HTTP 请求已发送,等待响应... 200 OK

长度:2070666907 (1.9G) [应用程序/zip]

保存到:'file.zip'

file.zip 53%[=========> ] 1.03G --.-KB/s in 18m 7s

2016-07-06 10:47:59 (995 KB/s) - 字节读取错误 1107205784/2070666907(指定会话已失效 某些原因。)。正在重试。

--2016-07-06 10:48:00--(试:2)https://service.s3.amazonaws.com/file.zip?AWSAccessKeyId=XXXX&Signature=XXXX&Expires=1468000000

连接到 service.s3.amazonaws.com (service.s3.amazonaws.com)|54.231.12.129|:443... 已连接。

HTTP 请求已发送,等待响应... 403 Forbidden

2016-07-06 10:48:01 错误 403:禁止。

【问题讨论】:

【参考方案1】:

我有一个类似的问题,和@panzerito 类似的答案,但把它分解成一个我称为 loopdone 的脚本

#!/bin/bash
until `$1`; do sleep 1; echo restarting; done

然后我可以做loopdone "wget -c http://my.url/"(包括引号)来强制它一次又一次地运行(并恢复,除非服务器不支持它)直到退出代码为0。(意味着没有错误)

【讨论】:

【参考方案2】:

Bash 代码: 初始错误退出状态;直到 [ "$?" -eq“0”];做 wget https://example.com/download/file.zip -c;完成

【讨论】:

以上是关于使 wget 在 3XX 重定向后重试原始 URL的主要内容,如果未能解决你的问题,请参考以下文章

在 Paypal 中完成购买后重定向到原始站点

React Router - PrivateRoute,登录后重定向到原始目的地

私人 Joomla 2.5 K2 项目在登录后重定向回主页而不是原始链接

强制 Shibboleth 在身份验证后重定向到特定 URL

facebook登录后重定向到一个URL

Laravel Ajax登录,成功后重定向到上一个url