如何用命令行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