feat(mera/b2c): публичный периметр МЕРЫ — свой API, отдельный экран оценки, короткие адреса #2913

Merged
lekss361 merged 6 commits from feat/mera-public-api into main 2026-08-16 07:25:24 +00:00
Showing only changes of commit 208173d816 - Show all commits

View file

@ -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-префиксом (тот же