Когда подходит Caddy
http://example.com/docs/start?ref=mailhttps://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. Укажите обе схемы явно
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. Проверьте и перечитайте конфигурацию
sudo caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile
sudo caddy reload --config /etc/caddy/Caddyfile --adapter caddyfileЭто распространённый путь, а не обязательное расположение файла. Используйте конфигурацию и способ управления именно своей службы. Сначала должен успешно завершиться validate; затем выполняйте reload работающего экземпляра.
После применения проверьте журнал выдачи сертификата и реальный HTTPS-запрос. Корректный синтаксис ещё не означает, что DNS уже обновился или центр сертификации смог подтвердить домен. Публичный сертификат www обслуживается отдельно на целевом хостинге.
4. Проверьте путь и параметры
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.
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 уже работает для других задач, дополнительный редирект может не увеличить платёж за сервер. Если сервер нужен только для перенаправлений, можно рассмотреть передачу этой задачи. Для выбранных страниц живого сайта потребуются отдельные правила; этот блок обрабатывает весь исходный хост.