Блог

Редирект в Caddy с автоматическим HTTPS

Caddy умеет сам выпускать и продлевать публичный сертификат. Для существующего сервера остаётся задать два исходных адреса и фиксированное назначение с сохранением URI.

Когда подходит Caddy

Пример маршрута
Исходный URLhttp://example.com/docs/start?ref=mail
HTTP301
Назначениеhttps://www.example.com/docs/start?ref=mail

И HTTP, и HTTPS источника идут сразу на HTTPS-назначение.

Этот способ для уже установленного Caddy с правом менять конфигурацию и выполнять reload. Нужны контроль DNS источника, доступные снаружи порты 80/443 и постоянное доступное для записи хранилище сертификатов Caddy. Назначение www должно работать самостоятельно.

Если Caddy запущен в контейнере, его данные о сертификатах должны переживать замену контейнера. На обычном сервере проверьте права пользователя службы на используемое хранилище. Это не место для временного каталога, который очищается при запуске.

Все адреса example.com и example.org здесь демонстрационные. Замените их своими. Меняйте только исходный хост: рабочие DNS-записи назначения должны остаться на месте. Источник и назначение не должны перенаправлять друг на друга.

Для проверки нового правила можно сначала выбрать 302. После подтверждённого постоянного переезда переключите его на 301: браузер способен кешировать постоянный редирект, и откат серверной настройки не удаляет уже сохранённый ответ у посетителя.

1. Подготовьте исходный хост

Направьте A и, если используется, AAAA исходного имени на Caddy. IPv6-запись не должна оставаться на другом сервере. Убедитесь, что firewall и внешняя маршрутизация пропускают соединения к портам 80 и 443.

Записи назначения www не переносите. Найдите существующий блок example.com, сохраните конфигурацию и внесите изменение в него. Остальные сайты в общем Caddyfile оставьте на месте.

2. Укажите обе схемы явно

Caddyfile · выделенный исходный домен
http://example.com, https://example.com {
    redir https://www.example.com{uri} 301
}

Запись http://example.com позволяет обработать HTTP нужным правилом сразу, без промежуточного перехода на HTTPS того же источника. Запись https://example.com включает HTTPS-обработку; подходящее публичное доменное имя участвует в автоматическом управлении сертификатом.

{uri} включает путь и query. Для /docs/start?tag=a&tag=b правило сохраняет и путь, и оба значения tag. Назначение задано строкой; входящий заголовок Host не определяет, куда отправить посетителя. Не добавляйте tls internal: внутренний центр сертификации не подходит для обычных посетителей публичного домена.

3. Проверьте и перечитайте конфигурацию

Пример для установки с /etc/caddy/Caddyfile
sudo caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile
sudo caddy reload --config /etc/caddy/Caddyfile --adapter caddyfile

Это распространённый путь, а не обязательное расположение файла. Используйте конфигурацию и способ управления именно своей службы. Сначала должен успешно завершиться validate; затем выполняйте reload работающего экземпляра.

После применения проверьте журнал выдачи сертификата и реальный HTTPS-запрос. Корректный синтаксис ещё не означает, что DNS уже обновился или центр сертификации смог подтвердить домен. Публичный сертификат www обслуживается отдельно на целевом хостинге.

4. Проверьте путь и параметры

Проверка корня и вложенного URL · GET
curl -sS -o /dev/null -D - 'http://example.com/'
curl -sS -o /dev/null -D - 'http://example.com/docs/start?tag=a&tag=b&utm_source=mail'
curl -sS -o /dev/null -D - 'https://example.com/'
curl -sS -o /dev/null -D - 'https://example.com/docs/start?tag=a&tag=b&utm_source=mail'

Ожидайте код 301. Для корня заголовок Location должен быть https://www.example.com/, для вложенного адреса — https://www.example.com/docs/start?tag=a&tag=b&utm_source=mail. Версия HTTP и регистр имени заголовка в выводе могут отличаться. Если временно выбрали 302, ожидаемый код — 302.

Дополнительно: HEAD и закодированные символы
curl -sS -I 'https://example.com/docs/start?tag=a&tag=b'
curl --path-as-is -sS -o /dev/null -D - 'https://example.com/files/report%20one.pdf?tag=a&tag=b&q=a%2Fb'

Не добавляйте -L к первой проверке: важно увидеть ответ источника, а не скрыть его за переходом. Затем отдельно откройте адрес назначения и убедитесь, что там есть нужная страница. DNS не создаёт HTTP-ответ, а сертификат назначения не заменяет сертификат источника.

Для обычного HTTP-запроса ожидается сразу Location на www, а не сначала на https://example.com. Проверьте %20 и %2F в своей конфигурации, особенно если рядом есть другие обработчики URI. Фрагменты вида #section в запрос к Caddy не попадают.

Если Caddy не выдаёт ожидаемый ответ

Диагностика
СимптомЧто проверить
Не удаётся получить сертификатA/AAAA, доступность портов, ошибки ACME и возможность записи в постоянное хранилище.
Появился лишний HTTP → HTTPS переходПроверьте явный HTTP-адрес блока и отсутствие другого обработчика источника перед нужным правилом.
После перезапуска снова начинается выдачаУбедитесь, что каталог данных сертификатов действительно сохраняется и доступен службе.
reload не применяетсяПроверьте используемый файл, результат validate и доступность штатного административного интерфейса в вашей установке.

Для отката верните сохранённый блок и снова выполните validate, затем reload. Если возвращаете старое обслуживание через DNS, сначала убедитесь в готовности прежнего хоста. Не очищайте хранилище сертификатов как способ отката правила: это отдельные данные, нужные и другим сайтам.

Что Caddy делает сам, а что остаётся вам

Caddy уже автоматизирует выпуск и продление сертификатов. Ради этой возможности менять его на сервис не обязательно. Владельцу остаются сам сервер, его обновления, доступность, резервирование конфигурации, хранилище данных и контроль ошибок.

Если Caddy уже работает для других задач, дополнительный редирект может не увеличить платёж за сервер. Если сервер нужен только для перенаправлений, можно рассмотреть передачу этой задачи. Для выбранных страниц живого сайта потребуются отдельные правила; этот блок обрабатывает весь исходный хост.

Документация

Нужен редирект, а не ещё одна настройка?

Caddy уже продлевает сертификаты автоматически. Redirect301 снимает другую задачу: владеть и управлять сервером, который нужен только для редиректов.

Redirect301 — 500 ₽ за домен в год. Мы берём на себя правила перенаправления, HTTPS и продление сертификата исходного домена. Подключение через DNS охватывает весь исходный хост; для отдельных страниц живого сайта нужна отдельная интеграция.

Что входит в 500 ₽

Redirect301

Узнать о запуске Redirect301

Оставьте email, чтобы получить уведомление об открытии доступа.