コマンドライン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 -sD - -o /dev/null http://example.com
-s
- プログレスバーを表示しない-D -
- ヘッダーをファイルにダンプしますが、-
はそれを標準出力に送ります-o /dev/null
- レスポンスボディを無視するこれはHEAD
リクエストを送信しないので-I
より優れています。
冗長にするためにそれほど多くのハックを必要としないので、-v
より優れています。
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が発生した場合は、curl
にURLリダイレクトに従うように指示する-L
引数スイッチを渡し、この場合はすべてのページのヘッダー(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
詳細オプションは便利ですが、(=ヘッダーだけでなく、送信されるHTTP本文も含めて) everything を参照したい場合は、以下のオプションのいずれかを使用することをお勧めします。
--trace-ascii -
#stdout--trace-ascii output_file.txt
#ファイル次のコマンドでNiceヘッダー出力が得られます。
curl -L -v -s -o /dev/null google.de
-L, --location
リダイレクトをフォローする-v, --verbose
more出力、方向を示します-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
は送信ヘッダーと受信ヘッダーの両方を出力し、本体の大きさを教えてくれますが、本体データはスキップします。
さらに読みやすくするために、すべての行に対して方向が示されています。長い一連のリダイレクトを追跡することが特に有用であることがわかりました。
Webアプリケーションをデバッグするとき、私は自分自身でこの問題を克服しなければなりませんでした。 -v
は素晴らしいですが、私の好みには少し も 冗長です。これは私が思いついた(bash専用)解決策です:
curl -v http://example.com/ 2> >(sed '/^*/d')
これは、-v
からの出力が標準出力ではなく標準エラーに送信されるために機能します。これをサブシェルにリダイレクトすることで、sed
にして*
で始まる行を削除できます。実際の出力はサブシェルを通過しないので、影響を受けません。サブシェルを使用するのは少し手間がかかりますが、stderrを別のコマンドにリダイレクトする最も簡単な方法です。 (私が述べたように、私はこれをテストのためだけに使っているので、それは私のためにうまく働きます。)
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オプションは、プログレスメータリングを禁止するためのものです。
以下のようなコマンドは3つのセクションを示します:リクエストヘッダ、レスポンスヘッダ、そしてデータ(CRLFで区切られています)。これは、curlによって追加された技術情報および構文上のノイズを回避します。
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
- 標準出力と標準エラー出力を単一の標準出力にまとめるsed
- 以下のコマンドを使用してcurlによって生成された編集応答/^* /d
- '*'で始まる行を削除する(技術情報)/bytes data]$/d
- 'bytes data]'で終わる行を削除する(技術情報)s/> //
- 接頭辞 '>'を削除s/< //
- 接頭辞 '<'を削除