diff --git a/Caddyfile b/Caddyfile index e02a49d7..b54f530c 100644 --- a/Caddyfile +++ b/Caddyfile @@ -304,14 +304,29 @@ meraocenka.ru { # параметров не принимает (форма проверки шлёт данные телом POST, а # черновик с лэндинга едет через sessionStorage — специально чтобы адрес # квартиры не попал в access-лог). + # `redir * <куда>`, а НЕ `redir <куда>`. Первый аргумент директивы, если он + # начинается со слэша, Caddy разбирает как inline path-matcher — то есть + # `redir / permanent` означает «для пути / редиректить на permanent», а не + # «редиректить на /». Проверено на живом Caddy: без `*` длинные адреса + # отдавали пустой 200 (матчер не совпадал, директива не срабатывала, тело + # пустое) — хуже, чем 404, потому что выглядит как рабочая пустая страница. @meraLongRoot path /trade-in/mera-public /trade-in/mera-public/ handle @meraLongRoot { - redir / permanent + redir * / permanent } - @meraLongSub path_regexp meralong ^/trade-in/mera-public/(.+)$ + # `([^/].*)`, а не `(.+)` — страховка от протокол-относительной цели. + # Захват, начинающийся со слэша, дал бы `redir` цель вида `//evil.example`, + # которую браузер резолвит как ЧУЖОЙ ХОСТ (открытый редирект с нашего + # домена). Проверено на живом Caddy: сегодня это недостижимо и без + # ограничения — Caddy нормализует путь ДО матчинга, схлопывая повторные + # слэши, и `//evil.example` (как и `/%2Fevil.example`) уже приезжает сюда + # одним слэшем, то есть редирект остаётся на нашем хосте. Ограничение + # оставлено намеренно: оно стоит ноль, а полагаться на нормализацию как на + # единственный барьер для дыры такого класса не хочется. + @meraLongSub path_regexp meralong ^/trade-in/mera-public/([^/].*)$ handle @meraLongSub { - redir /{re.meralong.1} permanent + redir * /{re.meralong.1} permanent } # Next.js уже эмитит ссылки на статику с /trade-in-префиксом (тот же