diff --git a/caddy/sites/apps.caddy b/caddy/sites/apps.caddy index e7630074..df2f75e0 100644 --- a/caddy/sites/apps.caddy +++ b/caddy/sites/apps.caddy @@ -12,6 +12,7 @@ # - meraocenka.ru — публичный лендинг МЕРА B2C (канонический домен) # - merahome.ru — 301 на meraocenka.ru (домен-спутник) # - meraotsenka.ru — 301 на meraocenka.ru (домен-спутник, альт. транслит) +# - www.mera*.ru — 301 на meraocenka.ru (все три www-формы) # # ПОЧЕМУ ЭТОТ ФАЙЛ ВООБЩЕ СУЩЕСТВУЕТ (не один Caddyfile на оба хоста). # Деплой делает git reset --hard на origin/main + `caddy reload` — на прод @@ -498,3 +499,26 @@ merahome.ru { meraotsenka.ru { redir https://meraocenka.ru{uri} permanent } + +# www-формы всех трёх доменов МЕРА → 301 на канонический apex. +# +# ЗАЧЕМ ОТДЕЛЬНЫЕ БЛОКИ. A-записи `www.*` заведены и указывают на прод, но +# site-блоков под них не было — Caddy матчит строго по имени хоста и на +# неизвестное имя сертификата не выпускает. Клиент, набравший привычное +# «www.», получал не редирект, а обрыв TLS-рукопожатия (alert 80): для +# браузера это «сайт не открывается», без единой строки в логах доступа. +# Найдено сквозным аудитом периметра 27.08; www.gendsgn.ru такой блок имел +# с самого начала (выше) и потому работал — здесь ровно тот же приём. +# +# `{uri}` сохраняет путь и query: ссылка с визитки не теряет ?id=. +www.meraocenka.ru { + redir https://meraocenka.ru{uri} permanent +} + +www.merahome.ru { + redir https://meraocenka.ru{uri} permanent +} + +www.meraotsenka.ru { + redir https://meraocenka.ru{uri} permanent +} diff --git a/scripts/smoke-mera-perimeter.sh b/scripts/smoke-mera-perimeter.sh index d15ff7db..3ac08d76 100644 --- a/scripts/smoke-mera-perimeter.sh +++ b/scripts/smoke-mera-perimeter.sh @@ -20,6 +20,8 @@ # закрыты. Именно API, а не страница: см. комментарий у проверки ниже. # 4. gendsgn.ru/api/v1/admin/* отдаёт 401 анониму (gate Site Finder). # 5. merahome.ru и meraotsenka.ru отдают 301 на канонический meraocenka.ru. +# 5b. www-формы всех трёх доменов МЕРА — тоже 301 (без своих site-блоков +# Caddy не выпускает сертификат, и клиент видит обрыв TLS, а не редирект). # # ВАЖНО: проверки 1 и 2 требуют, чтобы DNS A-record meraocenka.ru → IP VPS # уже существовал И деплой прошёл (сертификат Let's Encrypt выпущен). Пока @@ -163,6 +165,15 @@ check "gendsgn.ru/api/v1/admin/* — 401 anonymous" "$BASE_MAIN/api/v1/admin/use check "merahome.ru — 301 to canonical" "https://merahome.ru/" 301 check "meraotsenka.ru — 301 to canonical" "https://meraotsenka.ru/" 301 +# 5b. www-формы — та же проверка, отдельным блоком: их отсутствие проявляется +# НЕ как 404, а как обрыв TLS (curl вернёт пустой код). До 27.08 site-блоков +# под www.mera* не было, A-записи при этом существовали, и «www.» в адресной +# строке давал «сайт недоступен». Держим проверку, чтобы регресс был виден +# здесь, а не в жалобе клиента. +check "www.meraocenka.ru — 301 to canonical" "https://www.meraocenka.ru/" 301 +check "www.merahome.ru — 301 to canonical" "https://www.merahome.ru/" 301 +check "www.meraotsenka.ru — 301 to canonical" "https://www.meraotsenka.ru/" 301 + # 6. Платёжный периметр (PR-D2) — готовит почву под PR-D3 (роутер) и PR-D4 # (Caddy), но САМ НИЧЕГО НЕ ОТКРЫВАЕТ. Ожидаем закрытое состояние С ОБЕИХ # СТОРОН прямо сейчас: