Как отобразить заголовки запроса с помощью командной строки curl

568

Заголовок командной строки может отображать заголовок ответа с помощью -Dпараметра, но я хочу посмотреть, какой заголовок запроса он отправляет. Как я могу это сделать?

wwwxml
источник
28
curl --head http://google.comбудет делать то же самое, что и -Iфлаг :)
Абель Терефе
9
Примечание об использовании --head/ -I: не все серверы одинаково отвечают на HEADзапросы (например, Content-Encodingбудут отсутствовать, если вы пытаетесь проверить, что тело будет сжато), и не все серверы поддерживают HEAD. -vобычно более безопасный выбор.
cfeduke

Ответы:

752

curl -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
236

Популярный ответ для отображения заголовков ответов , но OP спросил о заголовках запросов .

curl -s -D - -o /dev/null http://example.com
  • -s : Не показывать индикатор выполнения
  • -D -: Дамп заголовки в файл, но -отправляет его на стандартный вывод
  • -o /dev/null : Игнорировать тело ответа

Это лучше, чем -Iкогда он не отправляет HEADзапрос, который может дать разные результаты.

Это лучше, чем -vпотому, что вам не нужно так много хаков, чтобы лишать его многословия.

JaffaTheCake
источник
17
Прочитайте вопрос - это для заголовков ответов, а не для заголовков запросов
Грэм Стюарт
58
Этот ответ полезен для меня, потому что я также неправильно понял вопрос.
Лиам
2
Эта команда немного отличается для Windows: curl -sD - -o NULL http://example.com
Сергей Власов
2
@SergeyVlasov На самом деле, эквивалент /dev/nullв Windows есть nul, нет null.
Франциско Сарабосо
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параметр аргумента, чтобы указать, 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
evandrix
источник
38
-IВариант показывает ответ заголовки. Вопрос был о запросе заголовков.
Асаф
53
Опция -Iзаставляет curl делать HTTP HEAD, что может изменить ответ от сервера. -vЯ считаю, что лучше использовать переключатель.
2013 г.
1
Если вы попробуете это с чем-то еще, кроме HEADзапроса (например -X POST) и получите «Вы можете выбрать только один HTTP-запрос!» чем stackoverflow.com/questions/286982/… вероятно, поможет вам. Дело в том, что -Iвыполняется HEADзапрос, как acwуказано, и когда ваш curlвызов настроен на повторный вызов, у вас есть два HTTP-запроса в curlвызове ...
flu
7
Это очень неправильный ответ. (Обещаю, что я обычно очень добр к этому.) 1. Это противоположно тому, что просит ОП. 2. Он использует метод запроса HEADвместо GETили POST. 3. Его НИКОГДА не следует использовать, чтобы «просто увидеть заголовки», если только вы не пытаетесь увидеть, как ваш сервер по-разному реагирует на a HEADв отличие от a GET. Это будет то же самое большую часть времени, но не всегда. Чтобы увидеть только заголовки использовать curl -o /dev/null -D /dev/stdout. Это даст ожидаемые результаты в 100% случаев.
Бруно Броноски
79

Опция verbose удобна, но если вы хотите увидеть все, что делает curl (включая передаваемое тело 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 выводятся как исходящие, так и входящие заголовки, а также пропускаются телоданные, сообщающие вам, насколько велико тело.

Дополнительно для каждой строки указывается направление, чтобы его было легко прочитать. Я нашел особенно полезным отследить длинные цепочки перенаправлений.

Benibr
источник
4
Мне нравится это лучше, чем -vвариант с более высокими голосами. Кроме того, просто для краткости, это также может быть curl -Lvso /dev/null <target>до тех пор, пока oприходит в конце.
визг
12

Команда, подобная приведенной ниже, покажет три раздела: заголовки запроса, заголовки ответа и данные (разделенные CRLF). Это позволяет избежать технической информации и синтаксического шума, добавляемого скручиванием.

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 - объединить стандартный вывод и стандартный вывод в один стандартный вывод
  • sed - отредактируйте ответ, полученный curl, используя команды ниже
  • /^* /d - удалить строки, начинающиеся с '*' (техническая информация)
  • /bytes data]$/d - удалить строки, заканчивающиеся на «байтовые данные]» (техническая информация)
  • s/> // - удалить префикс '>'
  • s/< // - удалить префикс «<»
igorpcholkin
источник
7

Мне пришлось самостоятельно преодолевать эту проблему при отладке веб-приложений. -vэто здорово, но слишком многословно для моих вкусов. Это решение (только для bash), которое я придумал:

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

Это работает, потому что выходные данные -vотправляются в stderr, а не в stdout. Перенаправив это на подоболочку, мы можем sedудалить строки, начинающиеся с *. Поскольку реальный вывод не проходит через подоболочку, это не затрагивается. Использование subshell немного сложновато, но это самый простой способ перенаправить stderr в другую команду. (Как я уже отметил, я использую это только для тестирования, поэтому он отлично работает для меня.)

jpfx1342
источник
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 запрещает измерение прогресса

toolchainX
источник
1

Если вы хотите больше альтернатив, вы можете попробовать установить HTTP-клиент Modern command line, например httpie который доступен для большинства операционных систем с менеджерами пакетов, такими как brew, apt-get, pip, yum и т. Д.

например: - для OSX

brew install httpie

Затем вы можете использовать его в командной строке с различными параметрами

http GET https://www.google.com

введите описание изображения здесь

Sudharshan
источник