cURL 可以检测到 307 响应吗?

Posted

技术标签:

【中文标题】cURL 可以检测到 307 响应吗?【英文标题】:Can cURL detect 307 response? 【发布时间】:2021-12-31 21:00:33 【问题描述】:

对于我的研究,我需要卷曲 fqdns 并获取它们的状态代码。 (对于 Http、Https 服务)但是一些 http url 以 https 打开,尽管它使用 cURL 返回 200。 (请求成功,没有重定向)

curl -I  http://example.example.com/
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 22 Nov 2021 10:43:32 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 64991
Connection: keep-alive
Keep-Alive: timeout=20
Vary: Accept-Encoding
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
Link: <https://example.example.com/>; rel=shortlink
X-Powered-By: WP Engine
X-Cacheable: SHORT
Vary: Accept-Encoding,Cookie
Cache-Control: max-age=600, must-revalidate
X-Cache: HIT: 10
X-Cache-Group: normal
Accept-Ranges: bytes

如上所示,我收到了 curl 请求的 200 响应。但我可以在浏览器中看到 307 代码。 (见下图)

Request URL: http://example.example.com/
Request Method: GET
Status Code: 307 Internal Redirect
Referrer Policy: strict-origin-when-cross-origin

我可以用 curl 检测 307 代码吗? (-L参数不起作用)有什么建议吗?

【问题讨论】:

您是在寻找终端命令,还是脚本有效? 感谢您的回复。只有终端命令。但结果,我会把它做成一个python脚本。 -L 选项告诉 cURL 自动跟随重定向。所以,删除这个选项并抓住response_code 一个可能的区别是大多数浏览器在请求期间发送的标头“Upgrade-Insecure-Requests”。这可能会导致内部重定向到 https。 在浏览器中打开开发工具。单击网络选项卡。转到网址。查看浏览器发送的标头。重复 curl 命令添加所有标题。现在还一样吗? 【参考方案1】:
curl -w '%response_code\n' -so /dev/null $URL

可以这样测试:

curl -w '%response_code\n' -so /dev/null httpbin.org/status/307 

那么问题中的 307 是什么?

正如 Stefan 在另一个答案中解释的那样:这是来自 Chrome 的 internal 消息,通知您它使用 HSTS。它不是实际的响应代码。这就是为什么 curl 无法显示它的原因。 Chrome 应该会更清楚地说明这一点。

HSTS

HSTS 是 HTTPS 服务器要求客户端不再通过明文 HTTP 与他们联系的一种方式。 curl 也支持 HSTS,但是您需要使用 --hsts - 而且 curl 仍然不会混淆地声明任何 307 响应代码。

【讨论】:

请求查询:curl -w '%response_code\n' -so /dev/null http://example.example.com 响应数据:200 我不想要解析。我想在 cURL 中查看我在浏览器中看到的 307 代码。您的命令显示 curl 数据的响应代码部分。 我的命令行仅显示响应代码。如果您使用的网址实际上会为您提供 307,您会看到。 没有。 curl 确切地显示了它得到了什么。当 curl 没有显示 307 时,表示它没有得到任何 307。可能服务器返回不同的客户端。 @Abdullah 您在 curl 和浏览器上看到不同的响应代码,因为它们发送的请求不完全相同,因此来自服务器的响应不同。您可以将浏览器请求转换为 curl 命令,此处记录:everything.curl.dev/usingcurl/copyas Curl 不显示 307,因为服务器没有发送它,这就是为什么它被浏览器称为内部重定向。【参考方案2】:

307 http 状态实际上并不是服务器发送的响应。这是一个内部重定向,你的浏览器在将请求发送到服务器之前为你做的事情。 这就是为什么它不会出现在 curl 中。这是您的浏览器的一项功能。在发送未更改的请求时,cURL 更加可靠。

在处理 HSTS (HTTP strict-transport-security) 的安全功能时,通常会遇到 307(尤其是因为您提到 https 重定向)内部重定向,其全部目的是确保您永远不会将未加密的 http 请求发送到想要通过加密 https 进行通信的服务器。

见this。

【讨论】:

嗨!欢迎来到 Stack Overflow,感谢您发布您的第一个答案。不幸的是,您给出的答案不正确。 307 确实是 HTTP 服务器发送的响应代码。它是 302 的轻微变体。有关详细信息,请参阅 developer.mozilla.org/en-US/docs/Web/HTTP/Status/307。 Stefan 正确解释了 为什么 询问的 307 实际上不是 HTTP 上的响应代码,这也是 curl 没有得到它的原因。奇怪的 307 消息只是 Chrome 使用 HSTS 的(令人困惑的)方式。 @jsha 错了。问题中的307 Internal Redirect 是 Chrome 在检查其本地缓存的 HSTS 数据后告诉用户它正在从 HTTP 切换到 HTTPS。 啊,感谢您对我的更正的更正。重新阅读 OP 我发现确实是这样。我一般将这个答案读作大约 307 个响应代码,而不是这里的特定实例,因此没有像我应该的那样彻底阅读 OP。向你道歉,斯特凡!

以上是关于cURL 可以检测到 307 响应吗?的主要内容,如果未能解决你的问题,请参考以下文章

ping检测服务器或带指定host去curl网站链接

如何检测服务器是不是正在使用 SPDY

POST 请求在 Postman 中有效,但在 Python 请求中无效(200 响应机器人检测)

shell脚本检测网络是否畅通

求大神指导 安装zencart系统检测出现curl有问题怎么办

如何检测 XHR 何时返回缓存的资源?