diff --git a/caddy/sites/apps.caddy b/caddy/sites/apps.caddy index 1bc227e7..ca670588 100644 --- a/caddy/sites/apps.caddy +++ b/caddy/sites/apps.caddy @@ -184,10 +184,13 @@ gendsgn.ru { } # Static HTML mockups для review (audit alternatives). - # Public access — без auth (по запросу 2026-05-17). + # Public access — без auth (по запросу 2026-05-17) — это намеренно и + # менять НЕ надо. Но каталог не должен листингом отдавать список + # файлов случайному посетителю: без `browse` file_server продолжает + # отдавать сами файлы по прямой ссылке, просто без index-листинга. handle_path /preview/* { root * /srv/preview - file_server browse + file_server } # Trade-In UI preview — public CI surface (#801). Рендерит mock-фикстуру @@ -400,6 +403,36 @@ www.gendsgn.ru { meraocenka.ru { encode zstd gzip + # #3471 (security-headers follow-up): публичный B2C-домен без базовых + # security-заголовков. Позиция директивы в файле не важна — Caddyfile + # применяет директивы в фиксированном порядке (`header` идёт раньше + # `reverse_proxy`), не по строке в исходнике. + # + # Проверено: ни tradein-mvp/frontend (обслуживает этот домен, отдаёт + # `/trade-in/mera-public*`), ни его next.config.ts/middleware не + # выставляют ни один из этих заголовков — дублирования нет. + header { + # 180 суток (15552000s). НЕ ставить includeSubDomains и НЕ ставить + # preload — оба флага практически необратимы (браузеры кэшируют + # preload-список надолго, includeSubDomains ломает любой будущий + # HTTP-поддомен), а не все поддомены meraocenka.ru гарантированно + # под нашим контролем. Если это когда-нибудь понадобится — отдельное + # осознанное решение, не «улучшение по умолчанию». + Strict-Transport-Security "max-age=15552000" + # Запрет встраивания во фрейм: X-Frame-Options — для старых + # клиентов, которые не понимают CSP; frame-ancestors — современный + # механизм. Оба вместе, не один вместо другого. + X-Frame-Options "DENY" + Content-Security-Policy "frame-ancestors 'none'" + X-Content-Type-Options "nosniff" + Referrer-Policy "strict-origin-when-cross-origin" + # Не даём стеку светиться в ответе. Полноценный CSP + # (default-src/script-src/...) сюда намеренно НЕ входит — отдельная + # работа с риском сломать фронт, здесь только периметр вокруг фрейма. + -Server + -X-Powered-By + } + log { output file /var/log/caddy/meraocenka.ru.log }