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


565

命令行curl可以通过使用-Doption 显示响应头,但是我想查看它正在发送什么请求头。我怎样才能做到这一点?


28
curl --head http://google.com会和-I国旗一样:)
Abel Terefe

9
关于使用--head/的注意事项-I:并非所有服务器对HEAD请求的响应都完全相同(例如,Content-Encoding如果您尝试验证正文是否被压缩,将会丢失),并且并非所有服务器都支持HEAD-v通常是比较安全的选择。
cfeduke 2014年

Answers:


749

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

6
如果我只想构造该软件包但不希望发送该怎么办?
PuercoPop 2013年

@jacobsimeon我认为这是因为它不仅显示Request标头,而且还显示Response标头Response主体
Pmpr

233

显示响应标头的一个流行答案,但OP询问了请求标头。

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

这比-I不发送HEAD请求可能会产生不同的结果要好。

这比-v因为不需要太多的hack来取消详细说明要好。


17
阅读问题-这是针对响应标头,而不是请求标头
Graeme Stuart

56
这个答案对我很有用,因为我也误解了这个问题。
利亚姆(Liam)

2
对于Windows,此命令略有不同: curl -sD - -o NULL http://example.com
Sergey Vlasov

2
@SergeyVlasov实际上,/dev/null在Windows中nul,等效于不是null
弗朗西斯科·扎拉波索

2
即使这个问题要求提供请求标头,但google仍将所有正在寻找响应标头的人引导到这里,所以我们很高兴这个答案在这里。这个答案是获取响应头的最佳方法。谢谢!!!
biomiker

96

我相信您要传递给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

38
-I选项显示响应标题。问题是关于请求标头。
Asaph 2013年

53
这些-I选项会使curl执行HTTP HEAD,这可能会更改服务器的响应。-v我相信最好使用开关。
2013年

1
如果您尝试使用除HEAD请求(例如-X POST)以外的任何内容进行尝试,并得到“您只能选择一个HTTP请求!” stackoverflow.com/questions/286982/…可能会帮助您。事情是-I做一个HEAD请求,如acw所述,当您的curl呼叫被设置为进行另一个呼叫时,您在curl呼叫中有两个HTTP请求……
flu

7
这是一个非常错误的答案。(我保证我对此通常会很友善。)1.它与OP的要求相反。2.它使用HEAD代替GET或的请求方法POST。3.除非您试图查看服务器对a HEAD相对于a的响应方式不同,否则不应将其用于“仅查看标头” GET。大多数时候都是一样的,但并非总是如此。要仅查看标题,请使用curl -o /dev/null -D /dev/stdout。这样可以100%地获得预期结果。
布鲁诺·布鲁诺斯基

79

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

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

我不这么认为,因为它也显示了响应标题和正文!
Pmpr

55

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

 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,尽管它告诉您body有多大。

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


4
我比-v投票更高的选项更好。另外,为简洁起见curl -Lvso /dev/null <target>,只要o结尾处也可以。
shriek

12

类似于以下命令的命令将显示三个部分:请求标头,响应标头和数据(由CRLF分隔)。它避免了卷曲所带来的技术信息和语法噪音。

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

该命令将产生以下输出:

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

HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=UTF-8
Location: https://stackoverflow.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=.stackoverflow.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://stackoverflow.com/">here</a></body>

描述:

  • -vs -添加标题(-v)但删除进度栏(-s)
  • 2>&1 -将stdout和stderr合并为单个stdout
  • sed -使用以下命令编辑curl产生的响应
  • /^* /d -删除以“ *”开头的行(技术信息)
  • /bytes data]$/d -删除以“字节数据]”结尾的行(技术信息)
  • s/> // -删除'>'前缀
  • s/< // -删除'<'前缀

7

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

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

之所以有效,-v是因为输出从发送到stderr,而不是stdout。通过将其重定向到子外壳,我们可以sed删除以开头的行*。由于实际输出不会通过子外壳,因此不会受到影响。使用subshel​​l有点繁琐,但这是将stderr重定向到另一个命令的最简单方法。(正如我指出的,我仅将其用于测试,因此对我来说很好用。)


4

curl的-v选项在错误输出中太冗长,该错误输出包含前导*(状态行)或>(请求头字段)或<(响应头字段)。仅获取请求标头字段:

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

仅获取请求标头字段:

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

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

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

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


1

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

例如:-对于OSX

brew install httpie

然后您可以在命令行中使用各种选项使用

http GET https://www.google.com

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.