如何使用命令行 curl 显示请求标头

Posted

技术标签:

【中文标题】如何使用命令行 curl 显示请求标头【英文标题】:How to display request headers with command line curl 【发布时间】:2011-03-16 05:39:08 【问题描述】:

命令行 curl 可以使用-D 选项显示响应头,但我想看看它发送的是什么请求头。我该怎么做?

【问题讨论】:

curl --head http://google.com 将与-I 标志相同:) 使用 --head/-I 的注意事项:并非所有服务器对 HEAD 请求的响应完全相同(例如,如果您尝试验证正文,Content-Encoding 将丢失将被压缩)并且并非所有服务器都支持HEAD-v 通常是更安全的选择。 How can I see the request headers made by curl when sending a request to the server? 的可能重复项 【参考方案1】:

curl 的 -v--verbose 选项显示 HTTP 请求标头等。这是一些示例输出:

$ curl -v http://google.com/
* About to connect() to google.com port 80 (#0)
*   Trying 66.102.7.104... connected
* Connected to google.com (66.102.7.104) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.16.4 (i386-apple-darwin9.0) libcurl/7.16.4 OpenSSL/0.9.7l zlib/1.2.3
> Host: google.com
> Accept: */*
> 
< HTTP/1.1 301 Moved Permanently
< Location: http://www.google.com/
< Content-Type: text/html; charset=UTF-8
< Date: Thu, 15 Jul 2010 06:06:52 GMT
< Expires: Sat, 14 Aug 2010 06:06:52 GMT
< Cache-Control: public, max-age=2592000
< Server: gws
< Content-Length: 219
< X-XSS-Protection: 1; mode=block
< 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
* Connection #0 to host google.com left intact
* Closing connection #0

【讨论】:

如果我只想构建包但不想发送呢? @jacobsimeon 我认为这是因为它不仅显示了 Request headers,还显示了 Response headersResponse body .【参考方案2】:

显示 response 标头的流行答案,但 OP 询问 request 标头。

curl -s -D - -o /dev/null http://example.com
-s : 避免显示进度条 -D - :将标头转储到文件中,但 - 将其发送到标准输出 -o /dev/null :忽略响应正文

这比-I 更好,因为它不发送HEAD 请求,这会产生不同的结果。

它比-v 更好,因为您不需要这么多的技巧来取消它的详细程度。

【讨论】:

阅读问题 - 这是针对响应标头而不是请求标头 这个答案对我很有用,因为我也误读了这个问题。 这个命令对于 Windows 有点不同:curl -sD - -o NULL http://example.com @SergeyVlasov 实际上,Windows 中/dev/null 的等价物是nul,而不是null 尽管这个问题要求提供请求标头,但谷歌正在引导所有正在寻找响应标头的人,所以我们都很高兴这个答案在这里。这个答案是获取响应标头的最佳选择。谢谢!!!【参考方案3】:

我相信您正在寻找传递给 curl 的命令行开关是 -I

示例用法:

$ curl -I http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287  
HTTP/1.1 301 Moved Permanently
Date: Sat, 29 Dec 2012 15:22:05 GMT
Server: Apache
Location: http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287/
Content-Type: text/html; charset=iso-8859-1

此外,如果您遇到响应 HTTP 状态代码 301,您可能还希望传递一个 -L 参数开关来告诉 curl 遵循 URL 重定向,并且在这种情况下,打印所有页面的标题(包括 URL 重定向),如下图所示:

$ curl -I -L http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287
HTTP/1.1 301 Moved Permanently
Date: Sat, 29 Dec 2012 15:22:13 GMT
Server: Apache
Location: http://heatmiser.counterhack.com/zone-5-15614E3A-CEA7-4A28-A85A-D688CC418287/
Content-Type: text/html; charset=iso-8859-1

HTTP/1.1 302 Found
Date: Sat, 29 Dec 2012 15:22:13 GMT
Server: Apache
Set-Cookie: UID=b8c37e33defde51cf91e1e03e51657da
Location: noaccess.php
Content-Type: text/html

HTTP/1.1 200 OK
Date: Sat, 29 Dec 2012 15:22:13 GMT
Server: Apache
Content-Type: text/html

【讨论】:

-I 选项显示 response 标头。问题是关于 request 标头。 -I 选项导致 curl 执行 HTTP HEAD,这可能会更改来自服务器的响应。我相信最好使用-v switch。 如果您尝试使用除HEAD 请求之外的任何其他请求(如-X POST)并得到“您只能选择一个HTTP 请求!” 而不是***.com/questions/286982/…可能会帮助你。问题是-I 做了一个HEAD 请求,就像acw 所说的那样,当您的curl 呼叫设置为进行另一个呼叫时,您在curl 呼叫中有两个HTTP 请求...... 这是一个非常错误的答案。 (我保证我在这里通常很友善。) 1. 它与 OP 的要求相反。 2.它使用HEAD的请求方法,而不是GETPOST。 3. 除非您试图查看您的服务器对HEADGET 的响应有何不同,否则它绝不应该用于“仅查看标题”。大多数时候都是一样的,但并非总是如此。要仅查看标题,请使用 curl -o /dev/null -D /dev/stdout。这将在 100% 的时间内给出预期结果。 可能值得一提的是-i 会同时打印响应标头和正文。【参考方案4】:

详细选项很方便,但如果您想查看 curl 所做的所有操作(包括传输的 HTTP 正文,而不仅仅是标头),我建议使用以下选项之一:

--trace-ascii -#标准输出 --trace-ascii output_file.txt#文件

【讨论】:

我不这么认为,因为它也显示了响应标题和正文!【参考方案5】:

您可以使用以下命令获得漂亮的标题输出:

 curl -L -v -s -o /dev/null google.de
-L, --location 关注重定向 -v, --verbose更多输出,指明方向 -s, --silent 不显示进度条 -o, --output /dev/null 不显示收到的正文

或更短的版本:

 curl -Lvso /dev/null google.de

结果:

* Rebuilt URL to: google.de/
*   Trying 2a00:1450:4008:802::2003...
* Connected to google.de (2a00:1450:4008:802::2003) port 80 (#0)
> GET / HTTP/1.1
> Host: google.de
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Location: http://www.google.de/
< Content-Type: text/html; charset=UTF-8
< Date: Fri, 12 Aug 2016 15:45:36 GMT
< Expires: Sun, 11 Sep 2016 15:45:36 GMT
< Cache-Control: public, max-age=2592000
< Server: gws
< Content-Length: 218
< X-XSS-Protection: 1; mode=block
< X-Frame-Options: SAMEORIGIN
<
* Ignoring the response-body
 [218 bytes data]
* Connection #0 to host google.de left intact
* Issue another request to this URL: 'http://www.google.de/'
*   Trying 2a00:1450:4008:800::2003...
* Connected to www.google.de (2a00:1450:4008:800::2003) port 80 (#1)
> GET / HTTP/1.1
> Host: www.google.de
> User-Agent: curl/7.43.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Fri, 12 Aug 2016 15:45:36 GMT
< Expires: -1
< Cache-Control: private, max-age=0
< Content-Type: text/html; charset=ISO-8859-1
< P3P: CP="This is not a P3P policy! See https://www.google.com/support/accounts/answer/151657?hl=en for more info."
< Server: gws
< X-XSS-Protection: 1; mode=block
< X-Frame-Options: SAMEORIGIN
< Set-Cookie: NID=84=Z0WT_INFoDbf_0FIe_uHqzL9mf3DMSQs0mHyTEDAQOGY2sOrQaKVgN2domEw8frXvo4I3x3QVLqCH340HME3t1-6gNu8R-ArecuaneSURXNxSXYMhW2kBIE8Duty-_w7; expires=Sat, 11-Feb-2017 15:45:36 GMT; path=/; domain=.google.de; HttpOnly
< Accept-Ranges: none
< Vary: Accept-Encoding
< Transfer-Encoding: chunked
<
 [11080 bytes data]
* Connection #1 to host www.google.de left intact

如您所见,curl 同时输出传出和传入的标头,并跳过 bodydata 以告诉您主体有多大。

此外,每行都标明了方向,以便于阅读。我发现追踪长长的重定向链特别有用。

【讨论】:

我更喜欢这个比-v 更高票数的选项。此外,为了简洁起见,这也可以是 curl -Lvso /dev/null &lt;target&gt;,只要 o 出现在末尾即可。【参考方案6】:

像下面这样的命令将显示三个部分:请求标头、响应标头和数据(由 CRLF 分隔)。它避免了 curl 添加的技术信息和语法噪音。

curl -vs www.***.com 2>&1 | sed '/^* /d; /bytes data]$/d; s/> //; s/< //'

该命令将产生以下输出:

GET / HTTP/1.1
Host: www.***.com
User-Agent: curl/7.54.0
Accept: */*

HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=UTF-8
Location: https://***.com/
Content-Length: 149
Accept-Ranges: bytes
Date: Wed, 16 Jan 2019 20:28:56 GMT
Via: 1.1 varnish
Connection: keep-alive
X-Served-By: cache-bma1622-BMA
X-Cache: MISS
X-Cache-Hits: 0
X-Timer: S1547670537.588756,VS0,VE105
Vary: Fastly-SSL
X-DNS-Prefetch-Control: off
Set-Cookie: prov=e4b211f7-ae13-dad3-9720-167742a5dff8; domain=.***.com; expires=Fri, 01-Jan-2055 00:00:00 GMT; path=/; HttpOnly

<head><title>Document Moved</title></head>
<body><h1>Object Moved</h1>This document may be found <a HREF="https://***.com/">here</a></body>

说明:

-vs - 添加标题 (-v) 但删除进度条 (-s) 2&gt;&amp;1 - 将标准输出和标准错误合并成一个标准输出 sed - 使用以下命令编辑 curl 生成的响应 /^* /d - 删除以“*”开头的行(技术信息) /bytes data]$/d - 删除以 'bytes data]' 结尾的行(技术信息) s/&gt; // - 删除 '> ' 前缀 s/&lt; // - 删除 '

【讨论】:

【参考方案7】:

在调试 Web 应用程序时,我必须自己解决这个问题。 -v 很棒,但对我的口味来说有点冗长。这是我想出的(仅限 bash)解决方案:

curl -v http://example.com/ 2> >(sed '/^*/d')

这是因为-v 的输出被发送到stderr,而不是stdout。通过将其重定向到子shell,我们可以sed 它删除以* 开头的行。由于真正的输出不通过子shell,所以不受影响。使用 subshel​​l 有点笨拙,但这是将 stderr 重定向到另一个命令的最简单方法。 (正如我所指出的,我只是将它用于测试,所以它对我来说很好。)

【讨论】:

【参考方案8】:

curl 的 -v 选项在包含前导 *(状态行)或 &gt;(请求头字段)或 &lt;(响应头字段)的错误输出中过于冗长。仅获取请求头字段:

curl -v -sS www.***.com 2>&1 >/dev/null | grep '>' | cut -c1-2 --complement

只获取请求头字段:

curl -v -sS www.***.com 2>&1 >/dev/null | grep '<' | cut -c1-2 --complement

或使用 -D 选项将其转储到 /tmp/test.txt 文件中

curl -D /tmp/test.txt -sS www.***.com > /dev/null

为了过滤-v输出,你应该将错误输出定向到终端,将std输出定向到/dev/null,-s选项是禁止进度计量

【讨论】:

【参考方案9】:

如果您想要更多替代方案,您可以尝试安装现代命令行 HTTP 客户端,例如 httpie,该客户端可用于大多数带有 brew、apt-get、pip、yum 等软件包管理器的操作系统

例如:- 对于 OSX

brew install httpie

然后你就可以在命令行中use它使用各种选项

http GET https://www.google.com

【讨论】:

以上是关于如何使用命令行 curl 显示请求标头的主要内容,如果未能解决你的问题,请参考以下文章

如何使用浏览器发送授权标头

向服务器发送请求时,如何查看 curl 生成的请求标头?

Echo curl 请求标题和正文而不发送它?

如何从 curl 请求中获取响应时间(通过命令行)

PHP cURL 自定义标头

curl命令行参数及使用