命令行curl可以使用 -D 选项显示响应头,但我想查看它发送的请求头 . 我怎样才能做到这一点?
-D
详细选项很方便,但是如果你想看到卷曲所做的一切(包括传输的HTTP主体,而不仅仅是 Headers ),我建议使用以下选项之一:
--trace-ascii - #stdout
--trace-ascii -
--trace-ascii output_file.txt #file
--trace-ascii output_file.txt
如果你想要更多的选择,你可以尝试安装一个现代命令行HTTP客户端,如httpie,它适用于大多数操作系统,包括brew,apt-get,pip,yum等包管理器
例如: - 对于OSX
brew install httpie
然后你可以在命令行上使用各种选项use
http GET https://www.google.com
在PHP设置卷曲选项
CURLINFO_HEADER_OUT => true,
CURLOPT_HEADER => 1,
并且可能将头部结果转储到mysql中...以便于记录 .
如果使用浏览器比F12 / Firebug提供的更详细,也可以使用wireshark
使用以下命令获得一个很好的标头输出:
curl -L -v -s -o /dev/null google.de
-L, --location 按照重定向
-L, --location
-v, --verbose 更多输出,指示方向
-v, --verbose
-s, --silent 不显示进度条
-s, --silent
-o, --output /dev/null 不显示收到的身体
-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 输出了传出和传入的 Headers ,然后跳过了bodydata,告诉你身体有多大 .
curl
此外,对于每一行,指示方向以便于阅读 . 我发现追踪长链重定向特别有用 .
curl的 -v 或 --verbose 选项显示HTTP请求标头等 . 这是一些示例输出:
-v
--verbose
$ 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 -sD - -o /dev/null http://example.com
-s - 避免显示进度条
-s
-D - - 将标头转储到文件,但 - 将其发送到stdout
-D -
-
-o /dev/null - 忽略响应正文
-o /dev/null
这比 -I 更好,因为它不会发送 HEAD 请求,这会产生不同的结果 .
-I
HEAD
它比 -v 更好,因为你不需要那么多的黑客来解开它 .
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 文件中
/tmp/test.txt
curl -D /tmp/test.txt -sS www.stackoverflow.com > /dev/null
为了过滤 -v 输出,你应该将错误输出定向到终端并将std输出定向到/ dev / null,-s选项是禁止进度计量
在调试Web应用程序时,我必须自己克服这个问题 . -v 很棒,但对我的口味来说有点过于冗长 . 这是我提出的(仅限bash)解决方案:
curl -v http://example.com/ 2> >(sed '/^*/d')
这是有效的,因为 -v 的输出被发送到stderr,而不是stdout . 通过将其重定向到子shell,我们可以 sed 删除以 * 开头的行 . 由于实际输出不通过子shell,因此不会受到影响 . 使用子shell有点笨拙,但它只是用它进行测试,所以对我来说效果很好 . )
sed
我相信你想要传递给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重定向,并且在这种情况下,打印所有页面的 Headers (包括URL重定向),如下图所示:
-L
$ 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
9 回答
详细选项很方便,但是如果你想看到卷曲所做的一切(包括传输的HTTP主体,而不仅仅是 Headers ),我建议使用以下选项之一:
--trace-ascii -
#stdout--trace-ascii output_file.txt
#file如果你想要更多的选择,你可以尝试安装一个现代命令行HTTP客户端,如httpie,它适用于大多数操作系统,包括brew,apt-get,pip,yum等包管理器
例如: - 对于OSX
然后你可以在命令行上使用各种选项use
在PHP设置卷曲选项
CURLINFO_HEADER_OUT => true,
并且可能将头部结果转储到mysql中...以便于记录 .
如果使用浏览器比F12 / Firebug提供的更详细,也可以使用wireshark
使用以下命令获得一个很好的标头输出:
-L, --location
按照重定向-v, --verbose
更多输出,指示方向-s, --silent
不显示进度条-o, --output /dev/null
不显示收到的身体或者更短的版本:
结果是:
正如你所看到的那样
curl
输出了传出和传入的 Headers ,然后跳过了bodydata,告诉你身体有多大 .此外,对于每一行,指示方向以便于阅读 . 我发现追踪长链重定向特别有用 .
curl的
-v
或--verbose
选项显示HTTP请求标头等 . 这是一些示例输出:-s
- 避免显示进度条-D -
- 将标头转储到文件,但-
将其发送到stdout-o /dev/null
- 忽略响应正文这比
-I
更好,因为它不会发送HEAD
请求,这会产生不同的结果 .它比
-v
更好,因为你不需要那么多的黑客来解开它 .curl的-v选项在错误输出中过于冗长,其中包含前导
*
(状态行)或>
(请求头字段)或<
(响应头字段) . 只获取请求头字段:只获取请求头字段:
或者使用-D选项将其转储到
/tmp/test.txt
文件中为了过滤
-v
输出,你应该将错误输出定向到终端并将std输出定向到/ dev / null,-s选项是禁止进度计量在调试Web应用程序时,我必须自己克服这个问题 .
-v
很棒,但对我的口味来说有点过于冗长 . 这是我提出的(仅限bash)解决方案:这是有效的,因为
-v
的输出被发送到stderr,而不是stdout . 通过将其重定向到子shell,我们可以sed
删除以*
开头的行 . 由于实际输出不通过子shell,因此不会受到影响 . 使用子shell有点笨拙,但它只是用它进行测试,所以对我来说效果很好 . )我相信你想要传递给curl的命令行开关是
-I
.用法示例:
此外,如果您遇到响应HTTP状态代码301,您可能还希望传递
-L
参数开关以告诉curl
遵循URL重定向,并且在这种情况下,打印所有页面的 Headers (包括URL重定向),如下图所示: