Перейти к основному содержимому

Домен: прокси-страницы, кэш, баннеры

Этот домен отвечает за гибридную часть сайта: Laravel может отдавать страницы, построенные поверх HTML старого WordPress/v1 сайта, и вставлять в них локальные блоки.

Основные файлы

ЗонаФайлы
Proxy routesapp/Providers/Frontend/ProxyPageServiceProvider.php
Proxy modelsapp/Models/Landing/Page/*
Proxy viewsresources/views/proxy-pages/*
Grabbed layoutsapp/View/Components/GrabbedLayout.php, GrabbedLandingLayout.php, GrabbedTailwindLandingLayout.php
Layout page componentapp/View/Components/Layout/Page.php
Page cache jobsapp/Jobs/PageCache/*
API hookroutes/api.php
Banners providerapp/Providers/Frontend/BannerServiceProvider.php
Banners controllerapp/Http/Controllers/BannerController.php
Banner modelsapp/Models/Landing/Banners/*, app/Models/Landing/Dictionary/LandingBannerType.php
Banner Livewireapp/Livewire/Inject/Banner/*
Redirect middlewareapp/Http/Middleware/Redirect.php
Redirect modelapp/Models/Landing/LandingRedirect.php

Proxy pages

Proxy page — это запись в landing_proxy_pages, которая говорит Laravel:

  • какой URL принять (from_path);
  • какой URL старого сайта использовать как источник (to_path);
  • какой layout применить (layout_id);
  • активна ли страница (active).

ProxyPageServiceProvider при старте приложения читает активные записи и регистрирует routes. Поэтому изменение записи в БД меняет публичную карту URL.

Шаблоны proxy pages

LandingLayout определяет тип layout. В коде используются варианты:

  • обычная proxy page;
  • tailwind proxy page.

В зависимости от layout route возвращает:

  • proxy-pages.page;
  • proxy-pages.tailwind-page.

{path?} в proxy routes

from_path может содержать {path?} для вложенных путей.

Пример:

from_path: blog/{path?}
to_path: https://systematika.org/v1/blog/{path?}

Тогда запрос /blog/some/post может быть прокинут на соответствующий старый URL.

Grabbed layout

Grabbed layout — это механизм, который:

  1. получает HTML старой страницы;
  2. достаёт нужные части layout;
  3. вставляет локальный Laravel/Livewire контент;
  4. кэширует результат;
  5. отдаёт пользователю уже гибридную страницу.

Это ключевая причина, почему публичный frontend проекта нельзя считать чисто Laravel frontend.

Page cache

Есть два уровня кэша:

  • записи/состояние в landing_page_cache_entries;
  • сгенерированные Blade/cache-файлы для grabbed/proxy layout.

Принудительное обновление использует header:

X-FORCE-UPDATE: true

Прогрев после WordPress hook

Поток page-cache hook:

  1. WordPress или внешний процесс вызывает POST /api/page-cache/wp-hook.
  2. Запрос должен иметь header X-WP-HOOK-KEY.
  3. API dispatch-ит TriggerWpPageCache.
  4. Job делает HTTP GET к WP URL.
  5. Если path соответствует активной proxy page, job dispatch-ит TriggerLaravelPageCache.
  6. TriggerLaravelPageCache делает HTTP GET к Laravel URL с X-FORCE-UPDATE.
  7. Laravel обновляет локальный cache proxy-страницы.

Для этого должен работать queue worker.

Landing redirects

LandingRedirect хранит redirect rules в БД.

Поля:

  • from;
  • to;
  • code;
  • active.

При сохранении:

  • from нормализуется;
  • to нормализуется как внешний URL или внутренний path;
  • cache landing_redirect_map сбрасывается.

Redirect middleware использует эту карту глобально. Поэтому redirect может перехватить почти любой URL до controller.

Баннеры

Баннеры регистрируются через BannerServiceProvider.

Routes:

  • /banner;
  • /v2/banner;
  • /close-banner;
  • /v2/close-banner.

BannerController@get() рендерит api.banner-code для переданного path. Если результат содержит marker <!-- blank element -->, controller возвращает null.

BannerController@close() пишет в session ключ закрытия counted footer banner на 7200 секунд.

LandingBanner

LandingBanner хранит:

  • type;
  • position;
  • views;
  • name;
  • content;
  • active;
  • via_data;
  • data.

Если via_data = true, content генерируется из data через helper:

  • generateFooterContent() для footer banner;
  • generateGkBannerContent() для GK banner.

При создании position автоматически ставится следующим внутри type.

Когда страница не обновляется

Проверяйте по порядку:

  1. Работает ли queue worker.
  2. Правильный ли WP_HOOK_KEY.
  3. Правильный ли WP_URL.
  4. Правильный ли WEBSERVER_URL.
  5. Есть ли активная LandingProxyPage для path.
  6. Совпадает ли pattern {path?}.
  7. Не отдаёт ли старая страница ошибку при HTTP GET.
  8. Не мешает ли LandingRedirect.
  9. Не застряли ли jobs в failed_jobs.
  10. Не нужен ли X-FORCE-UPDATE.

Админские точки управления

Что менятьГде
Proxy pagesLandingProxyPageResource
Layout typesLandingLayoutResource
Page cache entriesLandingPageCacheEntryResource
Null-prefix pagesLandingNullPrefixPageResource
RedirectsLandingRedirectResource
БаннерыBannerResource
Типы баннеровBannerTypeResource