`curl -I`と` curl -X HEAD`の違い


70

私はそれが同じことをすると推測したときに、http://www.reddit.comから面白いサーバーのタイプを見ていました。しかし、実際にはそうではありません。curl -I http://www.reddit.comcurl -X HEAD http://www.reddit.com

理由が知りたいです。

これは、2つのコマンドの実行を観察するものです。

  • curl -I:期待どおりに機能し、ヘッダーを出力して存在します。

  • curl -X HEAD:何も表示されず、ユーザー入力を待機しているようです。

しかし、tshark2番目のコマンドが実際に同じHTMLクエリを送信し、正しい答えを受信するのを見ると、スニッフィングは表示されず、接続を閉じません。

curl -I

0.000000 333.33.33.33 -> 213.248.111.106 TCP 59675 > http [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=47267342 TSER=0 WS=6
0.045392 213.248.111.106 -> 333.33.33.33 TCP http > 59675 [SYN, ACK] Seq=0 Ack=1 Win=5792 Len=0 MSS=1460 TSV=2552532839 TSER=47267342 WS=1
0.045441 333.33.33.33 -> 213.248.111.106 TCP 59675 > http [ACK] Seq=1 Ack=1 Win=5888 Len=0 TSV=47267353 TSER=2552532839
0.045623 333.33.33.33 -> 213.248.111.106 HTTP HEAD / HTTP/1.1
0.091665 213.248.111.106 -> 333.33.33.33 TCP http > 59675 [ACK] Seq=1 Ack=155 Win=6432 Len=0 TSV=2552532886 TSER=47267353
0.861782 213.248.111.106 -> 333.33.33.33 HTTP HTTP/1.1 200 OK
0.861830 333.33.33.33 -> 213.248.111.106 TCP 59675 > http [ACK] Seq=155 Ack=321 Win=6912 Len=0 TSV=47267557 TSER=2552533656
0.862127 333.33.33.33 -> 213.248.111.106 TCP 59675 > http [FIN, ACK] Seq=155 Ack=321 Win=6912 Len=0 TSV=47267557 TSER=2552533656
0.910810 213.248.111.106 -> 333.33.33.33 TCP http > 59675 [FIN, ACK] Seq=321 Ack=156 Win=6432 Len=0 TSV=2552533705 TSER=47267557
0.910880 333.33.33.33 -> 213.248.111.106 TCP 59675 > http [ACK] Seq=156 Ack=322 Win=6912 Len=0 TSV=47267570 TSER=2552533705

curl -X HEAD

34.106389 333.33.33.33 -> 213.248.111.90 TCP 51690 > http [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=47275868 TSER=0 WS=6
34.149507 213.248.111.90 -> 333.33.33.33 TCP http > 51690 [SYN, ACK] Seq=0 Ack=1 Win=5792 Len=0 MSS=1460 TSV=3920268348 TSER=47275868 WS=1
34.149560 333.33.33.33 -> 213.248.111.90 TCP 51690 > http [ACK] Seq=1 Ack=1 Win=5888 Len=0 TSV=47275879 TSER=3920268348
34.149646 333.33.33.33 -> 213.248.111.90 HTTP HEAD / HTTP/1.1
34.191484 213.248.111.90 -> 333.33.33.33 TCP http > 51690 [ACK] Seq=1 Ack=155 Win=6432 Len=0 TSV=3920268390 TSER=47275879
34.192657 213.248.111.90 -> 333.33.33.33 TCP [TCP Dup ACK 15#1] http > 51690 [ACK] Seq=1 Ack=155 Win=6432 Len=0 TSV=3920268390 TSER=47275879
34.823399 213.248.111.90 -> 333.33.33.33 HTTP HTTP/1.1 200 OK
34.823453 333.33.33.33 -> 213.248.111.90 TCP 51690 > http [ACK] Seq=155 Ack=321 Win=6912 Len=0 TSV=47276048 TSER=3920269022

この振る舞いの違いについてのアイデアはありますか?


回答:


66

違いはContent-Lengthヘッダーと、両方のコマンドによるヘッダーの処理方法に関係しているようです。

ただし、その前に、スイッチが提供されていない場合はcurl -X HEADデフォルトでcurlヘッダーを出力しないため(出力は必要ありません)、出力を行いません。-i-I

いずれにしてもcurl -I、ヘッダーを取得する適切な方法です。ヘッダーを要求して接続を閉じます。

他方でcurl -X HEAD -i述べられContent-Lengthたバイト数の伝達を待つでしょう。no Content-Lengthが指定されていない場合、いくつかのデータまたはその特定のヘッダーを待つと思います。

この動作を示すいくつかの例:

$ curl -X HEAD -i http://www.elpais.es
HTTP/1.1 301 Moved Permanently
Server: AkamaiGHost
Content-Length: 0
Location: http://www.elpais.com/
Date: Wed, 12 May 2010 06:35:57 GMT
Connection: keep-alive

Content-Lengthは0であるため、この場合、両方のコマンドの動作は同じです。そして、接続はその後閉じられます。

$ curl -X HEAD -i http://slashdot.org
HTTP/1.1 200 OK
Server: Apache/1.3.41 (Unix) mod_perl/1.31-rc4
SLASH_LOG_DATA: shtml
X-Powered-By: Slash 2.005001296
X-Bender: Since I love you all so much, I'd like to give everyone hugs.
X-XRDS-Location: http://slashdot.org/slashdot.xrds
Cache-Control: no-cache
Pragma: no-cache
Content-Type: text/html; charset=iso-8859-1
Content-Length: 115224
Date: Wed, 12 May 2010 06:37:20 GMT
X-Varnish: 1649060825 1649060810
Age: 1
Connection: keep-alive

curl: (18) transfer closed with 115224 bytes remaining to read

この場合、タイムアウトがあるようです(おそらくVarnishによる)ので、バイト数curlを受信する前に接続が閉じられたことに抗議しContent-Lengthます。

ところで、面白いX-Bender(例に示されている)とX-Fry(自分で試してみてください)ヘッダーを見てください:)。


2
他の誰かがこれを探している場合に備えて:PHPのcurlライブラリで設定するオプションはCURLOPT_NOBODYです。
マシュー

12

これはcurlのバグだと思います。-Xでメソッドを指定すると、curlはRFCに従って応答を処理する必要があります。残念ながら、curlのメンテナは同意しません。誰かがバグを提出し、パッチを提出しました:

http://sourceforge.net/tracker/?func=detail&atid=100976&aid=1810273&group_id=976

しかし、カールメンテナーはそれを拒否しました。壊れた「-X HEAD」オプションは「設計どおりに動作している」ようです。

-ジャムシッド


4
公平を期すために、チケットレスポンスのロジックに従うことができます--head。HEADリクエストの有効な実装を提供-X <method>し、リクエスト内のHTTPメソッドを単純にオーバーライドします。
ハンク14

3
はい、これは実際に私が必要としていたものでした。HEADリクエストを受け取ったときにコンテンツを提供するバグのあるサーバーがあります。-X HEADサーバーをRFCに準拠させようとしたときにテストできる唯一の方法でした
-Hashbrown

5

ドキュメントから:

-X、-request

(HTTP)HTTPサーバーと通信するときに使用するカスタム要求メソッドを指定します。指定された要求メソッドは、他の方法で使用されるメソッド(デフォルトはGET)の代わりに使用されます。詳細と説明については、HTTP 1.1仕様をお読みください。一般的な追加のHTTPリクエストにはPUTおよびDELETEが含まれますが、WebDAVなどの関連テクノロジーはPROPFIND、COPY、MOVEなどを提供します。

通常、このオプションは必要ありません。あらゆる種類のGET、HEAD、POST、およびPUT要求は、専用のコマンドラインオプションを使用して呼び出されます。

このオプションは、HTTPリクエストで使用される実際の単語を変更するだけで、curlの動作を変更しません。したがって、たとえば、適切なHEADリクエストを作成する場合、-X HEADを使用しても十分ではありません。-I、--headオプションを使用する必要があります。

言い換えれば、-X以外の方法のためであるGETHEADPOSTPUT。以下のためのHEAD使用-I


0

curl 7.34でcppコードを書くときに同じ問題に遭遇しますが、

curl_easy_setopt(curl_handle, CURLOPT_CUSTOMREQUEST, "HEAD");

長時間そこにハングアップし、タイムアウトが発生するまでボディ転送を待っているようです。新しい行を追加すると、この問題は解決されます。

curl_easy_setopt(curl_handle, CURLOPT_NOBODY, 1L );

ドキュメントから

本文を取得せずにダウンロードリクエストを行う

この行は、カールが待機しないように強制します。

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