Обновлено:

Шпаргалка по curl

curl — самый быстрый способ понять, что реально отдаёт сервер.
Браузер может кэшировать, скрывать детали и автоматически делать лишние запросы. curl показывает базовую правду: статус, заголовки, редиректы, время ответа.

Только заголовки

curl -kI https://getsrv.app/

Полезно для проверки:

  • HTTP-кода;
  • content-type;
  • cache-control;
  • security headers;
  • etag;
  • last-modified.

Заголовки без body, но подробнее

curl -kS -D - -o /dev/null https://getsrv.app/

Отличие от -I: это обычный GET, но тело не сохраняется. Иногда полезнее, чем HEAD, потому что некоторые серверы обрабатывают HEAD и GET по-разному.

Следовать редиректам

curl -kIL https://getsrv.app/

Флаги:

  • -I — только заголовки;
  • -L — следовать редиректам;
  • -k — не останавливать проверку на TLS validation error.

Показать каждый шаг подробнее

curl -kvI https://getsrv.app/

-v показывает:

  • куда подключается клиент;
  • какой TLS handshake происходит;
  • какой HTTP version используется;
  • какие заголовки отправлены и получены.

Проверить локальный listener через нужное имя

curl -kI --resolve getsrv.app:7443:127.0.0.1 https://getsrv.app:7443/

Это полезно, когда надо проверить локальный Nginx listener напрямую, но с правильным SNI/Host.

Проверить production через конкретный IP

curl -kI --resolve getsrv.app:443:127.0.0.1 https://getsrv.app/

Замените 127.0.0.1 на нужный IP, если надо проверить конкретный endpoint.

Вывести только код ответа

curl -kS -o /dev/null -w '%{http_code}\n' https://getsrv.app/

Ожидаемо для главной:

200

Для несуществующей страницы:

curl -kS -o /dev/null -w '%{http_code}\n' https://getsrv.app/no-such-page

Ожидаемо:

404

Вывести код, content-type и время

curl -kS -o /dev/null -w 'code=%{http_code} type=%{content_type} time=%{time_total}\n' https://getsrv.app/

Пример:

code=200 type=text/html time=0.064211

Посмотреть детальные тайминги

curl -kS -o /dev/null \
  -w 'dns=%{time_namelookup} connect=%{time_connect} tls=%{time_appconnect} first_byte=%{time_starttransfer} total=%{time_total}\n' \
  https://getsrv.app/

Что означает:

  • dns — время DNS lookup;
  • connect — TCP connect;
  • tls — TLS handshake;
  • first_byte — время до первого байта;
  • total — общее время запроса.

Проверить HTML cache policy

curl -kI https://getsrv.app/ | grep -i cache-control

Ожидаемо:

cache-control: public, must-revalidate

Проверить asset cache policy

ASSET="$(find /var/www/getsrv.app/assets -maxdepth 1 -type f | head -n 1 | sed 's#^/var/www/getsrv.app##')"
curl -kI "https://getsrv.app$ASSET" | grep -i cache-control

Ожидаемо:

cache-control: public, max-age=31536000, immutable

Проверить security headers

curl -kI https://getsrv.app/ \
  | grep -Ei 'content-security-policy|x-frame-options|x-content-type-options|referrer-policy|permissions-policy'

Ожидаемо:

x-content-type-options: nosniff
x-frame-options: DENY
referrer-policy: strict-origin-when-cross-origin
permissions-policy: ...
content-security-policy: ...

Сохранить body в файл

curl -ks https://getsrv.app/ -o /tmp/getsrv-home.html
wc -c /tmp/getsrv-home.html

Полезно, если надо сравнить HTML до и после деплоя.

Проверить наличие текста в HTML

curl -ks https://getsrv.app/ \
  | grep -oE 'эксплуатации веб-сервисов|С чего начать|Документация' \
  | sort -u

Если HTML минифицирован в одну строку, обычный grep -n может вывести всю страницу целиком. Для smoke-test лучше использовать grep -oE.

Типовые флаги

ФлагЧто делает
-IHEAD-запрос, только заголовки
-Lследовать редиректам
-kне прерываться на TLS validation error
-ssilent mode
-Sпоказывать ошибки даже в silent mode
-vподробный вывод
-o /dev/nullне сохранять body
-D -вывести response headers
--resolveвручную задать IP для имени
--connect-timeout 5лимит времени на подключение
--max-time 20общий лимит времени запроса

Набор для быстрого smoke-test

curl -kI https://getsrv.app/
curl -kI https://getsrv.app/ru/docs/
curl -kI https://getsrv.app/ru/tools/
curl -kI https://getsrv.app/sitemap-index.xml
curl -kI https://getsrv.app/no-such-page

Ожидаемо:

200
200
200
200
404