วิธีแสดงส่วนหัวของคำขอด้วย curl บรรทัดคำสั่ง


567

Curl บรรทัดคำสั่งสามารถแสดงส่วนหัวของการตอบสนองโดยใช้-Dตัวเลือก แต่ฉันต้องการที่จะดูว่าส่วนหัวของคำขอมันจะส่ง ฉันจะทำสิ่งนั้นได้อย่างไร


28
curl --head http://google.comจะทำเช่นเดียวกับ-Iธง :)
อาเบล Terefe

9
หมายเหตุเกี่ยวกับการใช้--head/ -I: ไม่เซิร์ฟเวอร์ทั้งหมดตอบสนองตรงเดียวกันเพื่อHEADร้องขอ (ตัวอย่างเช่นContent-Encodingจะหายไปถ้าคุณกำลังพยายามที่จะตรวจสอบว่าร่างกายจะได้รับการ gzipped) HEADและไม่ทั้งหมดสนับสนุนเซิร์ฟเวอร์ -vมักเป็นทางเลือกที่ปลอดภัยกว่า
cfeduke

คำตอบ:


751

curl's -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

6
ถ้าฉันต้องการสร้างแพ็คเกจ แต่ไม่ต้องการส่ง
PuercoPop

@jacobsimeon ผมคิดว่าเพราะมันแสดงให้เห็นว่าไม่เพียง แต่ส่วนหัวที่ขอแต่ยังส่วนหัวของการตอบสนองและร่างกายตอบสนอง
Pmpr

234

คำตอบยอดนิยมสำหรับการแสดงส่วนหัวการตอบกลับแต่ OP ถามเกี่ยวกับส่วนหัวคำขอ

curl -s -D - -o /dev/null http://example.com
  • -s : หลีกเลี่ยงการแสดงแถบความคืบหน้า
  • -D -: ถ่ายโอนข้อมูลส่วนหัวไปยังไฟล์ แต่-ส่งไปยัง stdout
  • -o /dev/null : ละเว้นเนื้อหาตอบกลับ

สิ่งนี้ดีกว่า-Iเพราะไม่ได้ส่งHEADคำขอซึ่งสามารถให้ผลลัพธ์ที่แตกต่างกัน

มันดีกว่า-vเพราะคุณไม่ต้องการแฮ็กจำนวนมากที่จะไม่เปิดเผย


17
อ่านคำถาม - นี่คือส่วนหัวของคำตอบที่ไม่ขอส่วนหัว
Graeme Stuart

57
คำตอบนี้มีประโยชน์สำหรับฉันเพราะฉันยังอ่านคำถามผิด
เลียม

2
คำสั่งนี้แตกต่างกันเล็กน้อยสำหรับ Windows: curl -sD - -o NULL http://example.com
Sergey Vlasov

2
@SergeyVlasov จริงเทียบเท่า/dev/nullใน Windows คือไม่nul null
Francisco Zarabozo

2
แม้ว่าคำถามนี้จะขอส่วนหัวคำขอก็ตาม แต่ Google ก็กำลังนำทุกคนมาที่นี่ซึ่งกำลังมองหาส่วนหัวการตอบสนองดังนั้นเราทุกคนดีใจที่คำตอบนี้อยู่ที่นี่ และคำตอบนี้ดีที่สุดสำหรับการรับส่วนหัวการตอบสนอง ขอบคุณ !!!
biomiker

96

-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สวิตช์อาร์กิวเมนต์เพื่อบอกcurlให้ติดตามการเปลี่ยนเส้นทาง URL และในกรณีนี้ให้พิมพ์ส่วนหัวของทุกหน้า (รวมถึงการเปลี่ยนเส้นทาง 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ตัวเลือกการแสดงการตอบสนองส่วนหัว คำถามเกี่ยวกับส่วนหัวของคำขอ
Asaph

53
-Iตัวเลือกทำให้เกิดการโค้งงอที่จะทำHTTP HEADซึ่งอาจมีการเปลี่ยนแปลงการตอบสนองจากเซิร์ฟเวอร์ ดีกว่าที่จะใช้-vสวิตช์ฉันเชื่อ
acw

1
หากคุณลองทำสิ่งอื่นนอกเหนือจากHEADคำขอ (เช่น-X POST) และรับ"คุณสามารถเลือกได้เพียงหนึ่งคำขอ HTTP!" กว่าstackoverflow.com/questions/286982/…อาจช่วยคุณได้ เป็นสิ่งที่-Iไม่ได้HEADร้องขอเช่นacwที่ระบุไว้และเมื่อคุณcurlโทรจัดตั้งขึ้นเพื่อทำสายอื่นคุณมีสองร้องขอ HTTP ในcurlการโทร ...
ไข้หวัด

7
นี่เป็นคำตอบที่ผิดมาก (ฉันสัญญาว่าฉันมักจะใจดีที่นี่) 1. มันตรงกันข้ามกับสิ่งที่ OP ถาม 2. ใช้วิธีการตามคำขอของHEADแทนหรือGET POST3. ไม่ควรใช้ "เพียงแค่เห็นหัว" เว้นแต่ว่าคุณกำลังพยายามที่จะดูว่าตอบสนองเซิร์ฟเวอร์ของคุณแตกต่างกันไปเมื่อเทียบกับHEAD GETมันจะเหมือนกันเกือบตลอดเวลา แต่ไม่เสมอไป curl -o /dev/null -D /dev/stdoutหากต้องการดูเฉพาะส่วนหัวใช้ ที่จะให้ผลลัพธ์ที่คาดหวัง 100% ของเวลา
Bruno Bronosky

79

ตัวเลือก verbose นั้นมีประโยชน์ แต่ถ้าคุณต้องการเห็นทุกอย่างที่ขด (รวมถึงเนื้อหา HTTP ที่ถูกส่งและไม่ใช่เฉพาะส่วนหัว) ฉันขอแนะนำให้ใช้หนึ่งในตัวเลือกด้านล่าง:

  • --trace-ascii - # stdout
  • --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ผลลัพธ์ทั้งส่วนหัวขาออกและขาเข้าและข้าม bodydata แม้ว่าจะบอกคุณว่าร่างกายมีขนาดใหญ่แค่ไหน

นอกจากนี้สำหรับทุกบรรทัดจะมีการระบุทิศทางเพื่อให้อ่านง่าย ฉันพบว่ามีประโยชน์อย่างยิ่งในการติดตามการเปลี่ยนเส้นทางที่ยาวนาน


4
ฉันชอบสิ่งนี้ดีกว่า-vตัวเลือกที่มีคะแนนโหวตสูงกว่า นอกจากนี้เพื่อความกะทัดรัดสิ่งนี้สามารถcurl -Lvso /dev/null <target>ตราบใดที่มันoมาถึงจุดสิ้นสุด
กรีด

12

คำสั่งเช่นด้านล่างจะแสดงสามส่วน ได้แก่ ส่วนหัวคำขอส่วนหัวตอบกลับและข้อมูล (คั่นด้วย 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 - รวม stdout และ stderr เป็น stdout เดียว
  • sed - แก้ไขคำตอบที่สร้างโดย curl โดยใช้คำสั่งด้านล่าง
  • /^* /d - ลบบรรทัดที่ขึ้นต้นด้วย '*' (ข้อมูลทางเทคนิค)
  • /bytes data]$/d - ลบบรรทัดที่ลงท้ายด้วย 'ข้อมูลไบต์]' (ข้อมูลทางเทคนิค)
  • s/> // - ลบคำนำหน้า '>'
  • s/< // - ลบคำนำหน้า '<'

7

ฉันต้องเอาชนะปัญหานี้ด้วยตนเองเมื่อทำการดีบั๊กเว็บแอปพลิเคชัน -vเป็นสิ่งที่ดี แต่verbose น้อยเกินไปสำหรับรสนิยมของฉัน นี่เป็นโซลูชัน (bash-only) ที่ฉันได้รับ:

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

ใช้งานได้เนื่องจากเอาต์พุตจาก-vถูกส่งไปยัง stderr ไม่ใช่ stdout โดยเปลี่ยนเส้นทางนี้เพื่อ subshell เราสามารถในการลบเส้นที่เริ่มต้นด้วยsed *เนื่องจากเอาต์พุตจริงไม่ผ่านไปยัง subshell จึงไม่ได้รับผลกระทบ การใช้ subshell นั้นค่อนข้างหนัก แต่ก็เป็นวิธีที่ง่ายที่สุดในการเปลี่ยนเส้นทาง stderr ไปยังคำสั่งอื่น (ดังที่ฉันสังเกตฉันใช้เพื่อการทดสอบเท่านั้นดังนั้นจึงใช้ได้ดีสำหรับฉัน)


4

ตัวเลือก -v สำหรับ curl นั้นละเอียดเกินไปในเอาต์พุตข้อผิดพลาดซึ่งมีการนำหน้า*(บรรทัดสถานะ) หรือ>(ฟิลด์ส่วนหัวคำขอ) หรือ<(ฟิลด์ส่วนหัวการตอบสนอง) เพื่อรับเฉพาะฟิลด์หัวข้อคำขอ:

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เอาท์พุทคุณควรส่งเอาต์พุตข้อผิดพลาดไปยังเทอร์มินัลและเอาต์พุต std ไปยัง / dev / null ตัวเลือก -s คือห้ามมิให้มีการวัดความคืบหน้า


1

หากคุณต้องการทางเลือกเพิ่มเติมคุณสามารถลองติดตั้งไคลเอนต์บรรทัดคำสั่ง Modern HTTP เช่นhttpieซึ่งใช้ได้กับระบบปฏิบัติการส่วนใหญ่ด้วยตัวจัดการแพ็คเกจเช่น Brew, apt-get, pip, yum เป็นต้น

เช่น: - สำหรับ OSX

brew install httpie

จากนั้นคุณสามารถใช้มันบนบรรทัดคำสั่งพร้อมตัวเลือกต่าง ๆ

http GET https://www.google.com

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.