コマンドラインカールでリクエストヘッダーを表示する方法


568

コマンドラインcurlは-Dオプションを使用して応答ヘッダーを表示できますが、送信している要求ヘッダーを確認したいと思います。どうやってやるの?


28
curl --head http://google.com-Iフラグと同じように動作します:)
Abel Terefe 2013年

9
--head/の使用に関する注意-I:すべてのサーバーがHEADリクエストに対してまったく同じように応答するわけではなく(たとえば、Content-Encoding本文がgzip圧縮されていることを確認しようとすると、すべてのサーバーがサポートされない)HEAD-v通常は、より安全な選択です。
cfeduke 14

回答:


752

curlの-vor --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 bodyも表示されるためだと思います。
2016年

235

応答ヘッダーを表示するための一般的な回答ですが、OPは要求ヘッダーについて質問しました。

curl -s -D - -o /dev/null http://example.com
  • -s :進行状況バーを表示しない
  • -D -:ヘッダーをファイルにダンプしますが、-標準出力に送信します
  • -o /dev/null :応答本文を無視

これは、異なる結果を生成する可能性が-IあるHEADリクエストを送信しない場合よりも優れています。

-v冗長化を解除するのにそれほど多くのハックを必要としないので、それよりも優れています。


17
質問をお読みください-これはリクエストヘッダーではなくレスポンスヘッダー用です
Graeme Stuart

58
私も質問を読み間違えたので、この答えは私にとって役に立ちます。
リアム

2
このコマンドは、Windows用のビット異なっている: curl -sD - -o NULL http://example.com
セルゲイVlasov

2
@SergeyVlasov実際には/dev/null、Windowsでのと同等のものはnul、ではなくnullです。
Francisco Zarabozo 2017

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引数スイッチを渡して、curlURLリダイレクトに従うように指示することもできます。この場合、以下に示すように、すべてのページ(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オプションは示してレスポンスヘッダを。問題はリクエストヘッダーに関するものでした。
アサフ2013年

53
この-Iオプションにより、curlはを実行HTTP HEADし、サーバーからの応答が変更される可能性があります。-vスイッチを使う方が良いと思います。
acw 2013

1
これをHEADリクエスト以外のもの(など-X POST)で試して、「HTTPリクエストは1つしか選択できません!」stackoverflow.com/questions/286982/より…はおそらくあなたを助けるでしょう。事はつまり-IませんHEADように、要求をacw明記し、お使いの際にcurl呼び出しが別の呼び出しを行うように設定しますが、2つのHTTPリクエスト持っているcurl...コールを
インフルエンザの

7
これは非常に間違った答えです。(私は通常、私はここでとても親切だと約束します。)1.これは、OPが要求するものの逆を行います。2. またはのHEAD代わりに要求メソッドを使用します。3.サーバーがに対してではなくに対してどのように応答するかを確認しようとしているのでない限り、「ヘッダーを表示する」ために使用しないでください。ほとんどの場合同じですが、常にそうとは限りません。ヘッダーのみを表示するには、を使用します。これにより、期待される結果が100%与えられます。GETPOSTHEADGETcurl -o /dev/null -D /dev/stdout
Bruno Bronosky

79

詳細オプションは便利ですが、curlが実行するすべての処理(ヘッダーだけでなく、送信されるHTTP本文を含む)を確認したい場合は、以下のオプションのいずれかを使用することをお勧めします。

  • --trace-ascii - #標準出力
  • --trace-ascii output_file.txt #ファイル

応答ヘッダーと本文も表示されるので、私はそうは思わない!
Pmpr

56

次のコマンドを使用して、優れたヘッダー出力を取得します。

 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、送信ヘッダーと受信ヘッダーの両方を出力し、本文の大きさを示していても、本文データをスキップします。

さらに、すべての行で方向が示されるため、読みやすくなっています。リダイレクトの長いチェーンを追跡することは特に有用であることがわかりました。


4
-v投票数が多いオプションよりもこのほうが好きです。また、簡潔にするために、これは最後に来るcurl -Lvso /dev/null <target>限り同じoです。
2017年

12

以下のようなコマンドは、リクエストヘッダー、レスポンスヘッダー、データ(CRLFで区切られた)の3つのセクションを表示します。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 -stdoutとstderrを1つのstdoutに結合
  • sed -以下のコマンドを使用して、curlによって生成された応答を編集します
  • /^* /d -'*'で始まる行を削除(技術情報)
  • /bytes data]$/d -'bytes data]'で終わる行を削除します(技術情報)
  • s/> // -'>'プレフィックスを削除
  • s/< // -'<'プレフィックスを削除

7

Webアプリケーションをデバッグするとき、私はこの問題を自分で克服しなければなりませんでした。-v素晴らしいですが、私の好みには少し冗長すぎます。これは私が思いついた(bashのみの)解決策です:

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

これ-vは、出力がstdoutではなくstderrに送信されるため機能します。これをサブシェルにリダイレクトすることsedで、で始まる行を削除でき*ます。実際の出力はサブシェルを通過しないため、影響を受けません。サブシェルを使用するのは少し重いですが、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出力をフィルタリングするには、エラー出力をターミナルに送り、標準出力を/ dev / nullに送る必要があります。-sオプションは、進行状況の測定を禁止します


1

より多くの選択肢が必要な場合は、brew、apt-get、pip、yumなどのパッケージマネージャーを備えたほとんどのオペレーティングシステムで使用できるhttpieなどの最新のコマンドラインHTTPクライアントをインストールしてみてください。

例:-OSXの場合

brew install httpie

次に、さまざまなオプションを指定してコマンドラインで使用できます

http GET https://www.google.com

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.