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

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

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 

我相信你正在寻找通过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遵循URLredirect,并且在这种情况下,打印所有页面的标题(包括URLredirect)如下图所示:

 $ 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 
 curl -sD - -o /dev/null http://example.com 
  • -s – 避免显示进度条
  • -D - – 将标题转储到文件,但是-将其发送到标准输出
  • -o /dev/null – 忽略响应主体

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

它比-v更好,因为你不需要太多的黑客来解开它。

verbose选项很方便,但是如果你想看看curl所做的一切 (包括传输的HTTP正文,而不仅仅是头文件),我build议使用--trace-ascii output_file.txt选项。

你用下面的命令得到一个不错的头部输出:

  curl -L -v -s -o /dev/null google.de 
  • -L, --location跟随redirect
  • -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,尽pipe告诉你身体有多大。

另外对于每一行都指示方向,以便读取。 我发现追查长链redirect是特别有用的。

在debuggingWeb应用程序时,我必须自己解决这个问题。 -v很好,但对我的口味有点过于冗长。 这是我提出的(bash-only)解决scheme:

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

这是有效的,因为-v的输出被发送到stderr而不是stdout。 通过redirect到一个子shell,我们可以sed它来删除以*开头的行。 由于实际输出不通过子shell,因此不受影响。 使用子shell有点笨重,但是将stderrredirect到另一个命令是最简单的方法。 (正如我注意到的,我只用这个进行testing,所以对我来说工作得很好。)

在包含前导* (状态行)或> (请求头字段)或< (响应头字段)的错误输出中,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 

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

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

为了过滤-v输出,你应该把错误输出指向terminal,把std输出指向/ dev / null,-s选项是禁止进度测量

在PHP中设置curl选项

CURLINFO_HEADER_OUT => true,

 CURLOPT_HEADER => 1, 

并可能转储标题结果到MySQL ..为更简单的日志logging。

如果使用浏览器比F12 / Firebug给出的更详细,也可以使用wireshark