wget --spider 失败并显示 404,但无需 --spider 即可工作

wget --spider 失败并显示 404,但无需 --spider 即可工作

我正在尝试在 docker 容器中进行健康检查。我发现这个命令:

wget --quiet --tries=1 --spider http://localhost:6077 || exit 1

问题是,当容器运行时,如果我在不带 --spider 的情况下运行 wget,我会得到 HTTP 200 代码,但如果使用 --spider,则会返回 404。

为什么会发生这种情况?

$ wget --tries=1  http://localhost:6077
--2019-04-22 04:20:12--  http://localhost:6077/
Resolving localhost (localhost)... 127.0.0.1, ::1
Connecting to localhost (localhost)|127.0.0.1|:6077... connected.
HTTP request sent, awaiting response... 200 OK
Length: 436 [application/xml]
Saving to: ‘index.html.1’


$ wget --tries=1 --spider  http://localhost:6077
Spider mode enabled. Check if remote file exists.
--2019-04-22 04:21:46--  http://localhost:6077/
Resolving localhost (localhost)... 127.0.0.1, ::1
Connecting to localhost (localhost)|127.0.0.1|:6077... connected.
HTTP request sent, awaiting response... 404 Not Found
Remote file does not exist -- broken link!!!

这种奇怪的行为正在破坏我的健康检查,如果我不使用 --spider 我认为 wget 会尝试在某个地方下载index.html,对吧?

答案1

接受的答案似乎是不正确的,实际上可以帮助您隐藏 Docker 容器中的错误。向 Wget添加该--spider选项将导致 Wget 发送HEAD请求而不是GET.尤其是在这种特殊情况下,您所在的位置不是使用 调用 Wget --recursive

根据 RFC 7231 第 4.3.2 节,HEAD请求与请求相同,GET只是它不包含消息正文。但是,在您的情况下,服务器似乎对 aHEAD和 aGET请求返回不同的响应。我将其称为您服务器中的错误。请不要简单地在没有蜘蛛的情况下调用 Wget 并将问题隐藏起来。此行为违反了 HTTP 规范,并且将来可能会导致其他问题,因为连接到它的客户端会看到错误的响应。

答案2

您的 wget 调用似乎--spider无法正常工作。它还应该使用请求返回 HTTP 200 HEAD。看达尔尼尔的回答

如果我不使用 --spider 我假设 wget 会尝试在某个地方下载 index.html 对吧?

-O如果您需要特定的文件名,您可以使用该选项设置设置输出文档,例如

wget --quiet --tries=1 -O/tmp/docker.html http://localhost:6077

或者,如果您不需要任何输出,可以使用-O -将结果打印到 stdout,然后将 stdout/stderr 重定向到/dev/null.

wget -O - http://localhost:6077 &>/dev/null

相关内容