cURL 可以检测 307 响应吗?

Abd*_*kli 13 https curl http httpresponse

为了我的研究,我需要 cURL fqdn 并获取它们的状态代码。(对于 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
Run Code Online (Sandbox Code Playgroud)

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

Request URL: http://example.example.com/
Request Method: GET
Status Code: 307 Internal Redirect
Referrer Policy: strict-origin-when-cross-origin
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*erg 65

curl -w '%{response_code}\n' -so /dev/null $URL
Run Code Online (Sandbox Code Playgroud)

可以这样测试:

curl -w '%{response_code}\n' -so /dev/null httpbin.org/status/307 
Run Code Online (Sandbox Code Playgroud)

那么问题中的307是什么?

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

HSTS

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

  • 不,curl 准确地显示了它所得到的结果。当curl 不显示307 时,意味着它没有“获取”任何307。服务器可能会向不同的客户端返回不同的结果。 (53认同)
  • 我的命令行仅显示响应代码。如果您使用的 URL 实际上会返回 307,您就会看到这一点。 (16认同)
  • @Abdullah您在curl和浏览器上看到不同的响应代码,因为它们不发送完全相同的请求,因此服务器的响应不同。您可以将浏览器请求转换为curl命令,它记录在此处:https://everything.curl.dev/usingcurl/copyas (15认同)
  • Curl 不会显示 307,因为服务器没有发送它,这就是浏览器将其称为“内部重定向”的原因。 (3认同)

小智 10

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

在处理 HSTS(HTTP 严格传输安全)的安全功能时,通常会遇到 307(特别是因为您提到了 https 重定向)内部重定向,其全部目的是确保您永远不会将未加密的 http 请求发送到以下服务器:想要通过加密的 https 进行通信。

看到这个

  • Stefan 正确地解释了 *为什么* 所询问的 307 实际上不是 HTTP 上的响应代码,这也是curl 无法获取它的原因。奇怪的 307 消息只是 Chrome 表示它使用 HSTS 的(令人困惑的)方式。 (5认同)
  • 你好!欢迎来到 Stack Overflow,感谢您发布您的第一个答案。不幸的是,您给出的答案是不正确的。307确实是HTTP服务器发送的响应代码。它是 302 的轻微变体。有关详细信息,请参阅 https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/307。 (4认同)
  • @jsha 错了。问题中的“307 内部重定向”是 Chrome 告诉用户在检查 HSTS 数据的本地缓存后,它正在从 HTTP 切换到 HTTPS。 (3认同)