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 响应吗?的主要内容,如果未能解决你的问题,请参考以下文章
POST 请求在 Postman 中有效,但在 Python 请求中无效(200 响应机器人检测)