Ворклог по задаче "Сделать универсальный рендеринг и маршрутизацию Concepts"

6 сент. 2026 г., 01:37:10

Assets Proxy Middleware для legacy-ассетов

В новой реализации добавлен middleware для обслуживания статических файлов legacy-сайта по пути /assets/.

Исходная проблема

Rails Asset Pipeline исторически разрешал ссылки на ассеты не напрямую по физическому расположению файла, а через собственный механизм поиска и manifest. В результате фактические файлы могут находиться в разных подкаталогах, тогда как HTML и CSS продолжают ссылаться на них через упрощённые пути.

На практике обнаружены как минимум следующие варианты хранения:

  • shared/assets/ — основные ассеты;
  • shared/assets/stylesheets/ — CSS и связанные файлы;
  • shared/assets/stylesheets/fonts/ — шрифты.

При этом клиентские ссылки могут выглядеть как /assets/filename.css или относительные url(font.woff2) без указания реального подкаталога. В старом Rails-приложении это скрывалось логикой Asset Pipeline.

Реализованное решение

Добавлен middleware server/middleware/assetsProxy.ts, который перехватывает запросы к /assets/ и последовательно ищет запрошенный файл в нескольких известных legacy-каталогах.

Порядок поиска:

  1. shared/assets/
  2. shared/assets/stylesheets/
  3. shared/assets/stylesheets/fonts/

Клиенту отдаётся первый найденный подходящий файл. Таким образом новая система воспроизводит необходимую часть поведения Rails Asset Pipeline без переноса самого pipeline.

Безопасность

В middleware предусмотрены базовые ограничения против выхода за пределы каталога ассетов:

  • блокируются пути с ..;
  • блокируются двоеточия в пути;
  • после нормализации проверяется, что resolved path остаётся внутри shared/assets/.

Значение для миграции

Это решение позволяет корректно отображать legacy-страницы и стили во время переходного периода без ручного переписывания большого количества исторических ссылок на ассеты. При этом compatibility-логика изолирована в одном месте и не проникает в основную модель данных или маршрутизацию haih-cms.

Дальнейшая проверка

  • проверить корректные MIME-типы для CSS, JS, шрифтов и изображений;
  • проверить cache headers;
  • проверить поведение при совпадающих именах файлов в нескольких каталогах;
  • убедиться, что middleware не позволяет читать файлы вне разрешённого дерева;
  • по мере нормализации ассетов решить, нужен ли proxy как постоянный слой или только как миграционная совместимость.
05.09.2026

Минимизировать число специализированных шаблонов: основная публикационная механика сайта должна работать поверх универсальной сущности Concept.