HEAD и OPTIONS

В контексте веб-разработки методы HTTP HEAD и OPTIONS играют ключевую роль при взаимодействии клиента и сервера. Они не используются для передачи содержимого страниц напрямую, но выполняют важные функции для оптимизации запросов, управления кэшированием и обеспечения безопасности.


Метод HEAD

Метод HEAD является аналогом метода GET, с той разницей, что сервер возвращает только заголовки ответа без тела. Это позволяет получить метаинформацию о ресурсе, не загружая его полностью.

Основные свойства метода HEAD:

  • Получение заголовков без тела: позволяет узнать размер контента (Content-Length), тип контента (Content-Type), дату последнего изменения (Last-Modified) и другие метаданные.
  • Оптимизация трафика: используется для проверки изменений ресурса перед его полной загрузкой.
  • Кэширование: совместно с заголовками ETag и Last-Modified помогает реализовать условные запросы и уменьшить нагрузку на сервер.

Пример использования fetch с HEAD:

fetch('https://example.com/resource', {
  method: 'HEAD'
})
  .then(response => {
    console.log('Content-Type:', response.headers.get('Content-Type'));
    console.log('Content-Length:', response.headers.get('Content-Length'));
  })
  .catch(error => console.error('Ошибка:', error));

В данном примере выполняется запрос к ресурсу, но тело ответа не загружается. Полученные заголовки позволяют определить размер и тип содержимого до его загрузки.

Особенности работы:

  • Сервер может возвращать статус-коды аналогично GET (200 OK, 404 Not Found).
  • Если ресурс изменился, заголовок Last-Modified будет обновлён, что полезно для условных запросов.
  • HEAD-запросы применяются в мониторинге доступности ресурсов и в предварительных проверках перед загрузкой больших файлов.

Метод OPTIONS

Метод OPTIONS позволяет определить поддерживаемые сервером методы HTTP для конкретного ресурса. Он важен для реализации CORS (Cross-Origin Resource Sharing) и проверки возможностей сервера.

Основные свойства метода OPTIONS:

  • Получение списка поддерживаемых методов: заголовок Allow возвращает методы, разрешённые для данного ресурса.
  • Проверка кросс-доменных запросов: используется браузерами для отправки предзапросов (preflight) перед PUT, DELETE, POST с нестандартными заголовками.
  • Диагностика и отладка: помогает понять, какие методы разрешены сервером без изменения состояния ресурса.

Пример использования fetch с OPTIONS:

fetch('https://example.com/resource', {
  method: 'OPTIONS'
})
  .then(response => {
    console.log('Allowed Methods:', response.headers.get('Allow'));
  })
  .catch(error => console.error('Ошибка:', error));

Особенности работы:

  • Метод OPTIONS не должен изменять состояние ресурса, это безопасный и идемпотентный метод.

  • В ответе могут быть дополнительные заголовки, важные для CORS:

    • Access-Control-Allow-Origin
    • Access-Control-Allow-Methods
    • Access-Control-Allow-Headers
  • Предзапрос (preflight) выполняется автоматически браузером при выполнении кросс-доменных операций с нестандартными заголовками или методами, отличными от GET/POST.


Отличия HEAD и OPTIONS

Характеристика HEAD OPTIONS
Возвращаемое тело Нет Обычно нет
Использование Получение метаданных ресурса Проверка поддерживаемых методов
Кэширование Да, совместно с ETag/Last-Modified Не применяется к кэшированию ресурса напрямую
Применение в CORS Нет Да, для preflight запросов
Безопасность Идемпотентен Идемпотентен

Практические советы

  • Для проверки доступности файлов на сервере без загрузки используйте HEAD.
  • Для настройки CORS и диагностики разрешённых методов используйте OPTIONS.
  • Совмещение HEAD с условными запросами (If-Modified-Since, If-None-Match) значительно снижает трафик и ускоряет работу веб-приложений.
  • В инструментах разработчика браузера можно наблюдать ответы на OPTIONS-запросы при кросс-доменных вызовах, что помогает отладке серверной конфигурации.

Использование в Node.js

В среде Node.js методы HEAD и OPTIONS обрабатываются аналогично другим HTTP-методам с помощью встроенного модуля http или фреймворков вроде Express.

Пример Express:

const express = require('express');
const app = express();

app.head('/resource', (req, res) => {
  res.set('Content-Length', '1234');
  res.set('Content-Type', 'text/plain');
  res.status(200).end();
});

app.options('/resource', (req, res) => {
  res.set('Allow', 'GET,HEAD,POST,OPTIONS');
  res.set('Access-Control-Allow-Methods', 'GET,HEAD,POST,OPTIONS');
  res.status(204).end();
});

app.listen(3000);

В этом примере сервер возвращает заголовки для HEAD и список разрешённых методов для OPTIONS, обеспечивая корректную работу клиента и поддержку CORS.