wget:不要跟随重定向

67

我该如何防止wget跟随重定向?


在我的情况下,wget --mirror http://some.url 中的 301 重定向会将 index?q=1 保存为 /pretty/urls/ 的副本,尽管最初请求 index 返回了 HTTP 301 永久重定向。 - here
5个回答

62

--max-redirect 0

我没有尝试过这个选项,它将允许零次重定向或无限制的重定向。


我认为你也可以使用--level=1或-l=1来进行一级重定向。--level=0与--level=inf相同,即无限制。 - MJB
5
很不幸,如果您想获取重定向的响应正文,这是行不通的... - user2428118
5
刚刚有机会尝试了一下;--max-redirect 0 允许没有重定向,而不是无限制的重定向。 - BMDan
1
“--max-redirect 0”在我的旧版wget 1.12上出现“超出0次重定向”的故障。因此,它无法抑制重定向,但在发生重定向时会失败。“curl”则可以正常工作。 - j08lue
1
顺便提一下,--level 是用于递归的(跟随 链接,而不是重定向)。 - j08lue
显示剩余3条评论

18

使用没有-L选项的 curl 命令来代替 wget。在使用 curl 时省略该选项将会阻止重定向。

如果使用 curl -I <URL> ,则可以获得头文件而不是重定向HTML文件。

如果使用 curl -IL <URL> ,则您将同时获得所请求的URL以及被重定向到的URL的头文件。


2
在我的环境中,wget比curl拥有更多的访问权限。 - user2258887
我尝试下载prisonexp.org的网站图标,但是我被拒绝访问。根据一个SO用户的说法,wget没有问题,所以我现在正在实施它。 - user2258887
1
“curl -I” 更好,它只打印标头信息。 - Colin 't Hart
@Colin'tHart:我在我的回答中添加了一些信息。谢谢。 - Dennis Williamson
问题是关于wget,而不是curl - Daniel

7

一些版本的 wget 命令有一个 --max-redirect 选项:详见这里


3

一般来说,依赖于特定数量的重定向并不是一个好主意。

例如,为了下载IntellijIdea,承诺始终解析到Linux社区版最新版本的URL类似于https://download.jetbrains.com/product?code=IIC&latest&distribution=linux,但如果你现在访问该URL,你将会被重定向两次,才能到达实际可下载的文件。未来你可能被重定向三次,或者根本不会被重定向。

解决这个问题的方法是使用HTTP HEAD动词。以下是我在IntellijIdea中解决此问题的方式:

# This is the starting URL.
URL="https://download.jetbrains.com/product?code=IIC&latest&distribution=linux"
echo "URL: $URL"

# Issue HEAD requests until the actual target is found.
# The result contains the target location, among some irrelevant stuff.
LOC=$(wget --no-verbose --method=HEAD --output-file - $URL)
echo "LOC: $LOC"

# Extract the URL from the result, stripping the irrelevant stuff.
URL=$(cut "--delimiter= " --fields=4 <<< "$LOC")
echo "URL: $URL"

# Optional: download the actual file.
wget "$URL"

3
默认情况下,wget会跟随最多20个重定向。但是,它不会跨主机。如果你要求wget下载example.com,它不会接触任何在www.example.com的资源。wget会将其检测为一个扩展到另一个主机的请求,并予以拒绝。
简而言之,您应该执行以下操作:
wget --mirror www.example.com

不是
wget --mirror example.com

现在假设 www.example.com 的所有者有几个子域名在 example.com,而我们对它们都感兴趣。怎么办呢?
试试这个方法:
wget --mirror --domains=example.com example.com

wget现在将访问example.com的所有子域名,包括m.example.comwww.example.com

不使用镜像,只想获取302的头信息,不想跟随302。我该怎么做? - Michael
它只在蜘蛛模式下“不跨主机”。 - AnrDaemon
这并没有回答问题:它仍将遵循网站内的301或302响应。正如提问者所提到的,他只想要头信息。 - Colin 't Hart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接