如何使用命令行 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 headers 和 Response 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
的请求方法,而不是GET
或POST
。 3. 除非您试图查看您的服务器对HEAD
与GET
的响应有何不同,否则它绝不应该用于“仅查看标题”。大多数时候都是一样的,但并非总是如此。要仅查看标题,请使用 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 <target>
,只要 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>&1
- 将标准输出和标准错误合并成一个标准输出
sed
- 使用以下命令编辑 curl 生成的响应
/^* /d
- 删除以“*”开头的行(技术信息)
/bytes data]$/d
- 删除以 'bytes data]' 结尾的行(技术信息)
s/> //
- 删除 '> ' 前缀
s/< //
- 删除 '
【讨论】:
【参考方案7】:在调试 Web 应用程序时,我必须自己解决这个问题。 -v
很棒,但对我的口味来说有点太冗长。这是我想出的(仅限 bash)解决方案:
curl -v http://example.com/ 2> >(sed '/^*/d')
这是因为-v
的输出被发送到stderr,而不是stdout。通过将其重定向到子shell,我们可以sed
它删除以*
开头的行。由于真正的输出不通过子shell,所以不受影响。使用 subshell 有点笨拙,但这是将 stderr 重定向到另一个命令的最简单方法。 (正如我所指出的,我只是将它用于测试,所以它对我来说很好。)
【讨论】:
【参考方案8】:curl 的 -v 选项在包含前导 *
(状态行)或 >
(请求头字段)或 <
(响应头字段)的错误输出中过于冗长。仅获取请求头字段:
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 显示请求标头的主要内容,如果未能解决你的问题,请参考以下文章