From 031b4559b9fd065846edad5fd77c47175917cc07 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Thu, 27 Aug 2026 14:17:15 +0300 Subject: [PATCH] =?UTF-8?q?fix(mera/perimeter):=20www-=D1=84=D0=BE=D1=80?= =?UTF-8?q?=D0=BC=D1=8B=20=D0=B4=D0=BE=D0=BC=D0=B5=D0=BD=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=9C=D0=95=D0=A0=D0=90=20=D0=BE=D0=B1=D1=80=D1=8B=D0=B2=D0=B0?= =?UTF-8?q?=D0=BB=D0=B8=20TLS=20=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B4=D0=B8=D1=80=D0=B5=D0=BA=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A-записи www.meraocenka.ru / www.merahome.ru / www.meraotsenka.ru заведены и указывают на прод, но site-блоков под них в Caddy не было. Caddy матчит строго по имени хоста и на неизвестное имя сертификата не выпускает, поэтому клиент, набравший привычное «www.», получал обрыв рукопожатия (TLS alert 80) — для браузера это «сайт не открывается». В логах доступа при этом ни строки: до HTTP-слоя запрос не доходил, так что молчали и метрики. www.gendsgn.ru такой блок имел с самого начала и потому работал — здесь ровно тот же приём, три отдельных блока с 301 на канонический meraocenka.ru. Найдено сквозным аудитом периметра 27.08. Проверено: три www-имени резолвятся в 188.124.37.140, curl до правки возвращал пустой код (000) на всех трёх, www.gendsgn.ru — 301. Смоук периметра дополнен проверкой 5b: отсутствие блока проявляется НЕ как 404, а как пустой код ответа, и обычная проверка «спутники отдают 301» такой регресс не ловила. --- caddy/sites/apps.caddy | 24 ++++++++++++++++++++++++ scripts/smoke-mera-perimeter.sh | 11 +++++++++++ 2 files changed, 35 insertions(+) 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), но САМ НИЧЕГО НЕ ОТКРЫВАЕТ. Ожидаем закрытое состояние С ОБЕИХ # СТОРОН прямо сейчас: -- 2.45.3