Curl
curl -I
和 curl -X HEAD
之間的區別
我正在觀看來自http://www.reddit.com的有趣的伺服器類型,
curl -I http://www.reddit.com
當時我猜它curl -X HEAD http://www.reddit.com
會做同樣的事情。但事實上,並非如此。我很好奇為什麼。
這是我觀察到執行這兩個命令:
curl -I
:按預期工作,輸出標題並存在。curl -X HEAD
: 不顯示任何內容,似乎在等待使用者輸入。但是,嗅探
tshark
我看到第二個命令實際上發送了相同的 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
關於為什麼這種行為差異的任何想法?
似乎差異與
Content-Length
標題以及兩個命令如何處理它有關。但在進入之前,
curl -X HEAD
不提供任何輸出,因為預設情況下,curl
如果未提供開關,則不列印標題-i
(雖然不需要-I
)。無論如何,
curl -I
這是獲取標頭的正確方法。它只是要求標題並關閉連接。另一方面
curl -X HEAD -i
將等待傳輸的字節數由Content-Length
. 在Content-Length
沒有指定 no 的情況下,我猜它會等待一些數據或那個特定的標題。顯示此行為的一些範例:
$ 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(自己嘗試)標題 :)。