`curl -I`와`curl -X HEAD`의 차이점


70

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

왜 이런 행동의 차이에 대한 아이디어가 있습니까?


답변:


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-Length0,이 경우 두 명령은 동일한 동작합니다. 연결은 나중에 닫힙니다.

$ 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의 컬 라이브러리에서 설정하는 옵션은 CURLOPT_NOBODY입니다.
Matthew

12

나는 이것이 컬의 버그라고 생각합니다. -X로 메소드를 지정하면 curl은 RFC에 따라 응답을 처리해야합니다. 불행히도 컬 관리자는 동의하지 않습니다. 누군가 버그를 제기하고 패치를 제출했습니다.

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

그러나 컬 관리자는 그것을 거부했습니다. 깨진 "-X HEAD"옵션은 "디자인 된대로 작동"하는 것 같습니다.

-잼 시드


4
공정 하게 말하면 티켓 응답의 논리를 따를 수 있습니다 --head. HEAD 요청의 유효한 구현을 제공하고 요청 -X <method>의 HTTP 메소드를 대체합니다.
행크

3
예, 이것이 실제로 필요한 것입니다. HEAD 요청이있을 때 콘텐츠를 제공하는 버기 서버가 있습니다. -X HEAD서버가 RFC를 준수하려고 할 때 테스트 할 수있는 유일한 방법이었습니다
Hashbrown

5

에서 워드 프로세서 :

-X,-요청

(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이외의 방법입니다 GET, HEAD, POSTPUT. 위해 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.