Skip to content

Маршруты и редиректы

Маршруты, созданные из менеджера, хранятся в pb_routes. Для всего, что контент-редактор должен уметь без правки файлов: перенести страницу, увести старый адрес, показать по адресу шаблон.

PageBlocks → Маршруты.

Поля строки

ПолеЧто это
contextКонтекст MODX, к которому относится маршрут
methodHTTP-метод, по умолчанию GET
uriАдрес, без ведущего слэша
typeЧто происходит — см. ниже
targetКуда: URL, шаблон, чанк или действие контроллера
statusHTTP-статус для редиректа. По умолчанию 301
menuindexПорядок, он же решает спор между равными
published_atНеопубликованный маршрут не существует

Типы

Типtarget — этоЧто происходит
redirectURLПеренаправление на него со статусом status
redirect_controllerController@methodАдрес действия вычисляется по зарегистрированным маршрутам, дальше перенаправление
controllerController@methodЗапрос обрабатывает действие
viewШаблон MODXРендерится этот шаблон
file_chunkФайл Fenom из core/App/elements/Рендерится этот файл

redirect_controller нужен, чтобы редирект пережил смену адреса: вы указываете на действие, а URL ищется в момент запроса. Если действие не разрешилось, строка пропускается, а не уводит куда попало.

301 по умолчанию — намеренно

Редирект, заведённый руками, почти всегда означает «этот адрес переехал насовсем». 302 говорит поисковику обратное и оставляет старый URL в индексе. Ставьте 302, только когда переезд действительно временный.

Кто побеждает

Маршруты приходят из двух мест — из файлов и из этой таблицы, — поэтому порядок зафиксирован:

  1. Редиректы побеждают всё для того же GET-адреса. Файловый маршрут на этот адрес пропускается, откуда бы редирект ни пришёл — из файла или из таблицы.
  2. Среди редиректов побеждает первый; дубли на один адрес отбрасываются, а не роняют диспетчер.
  3. Для controller, view и file_chunk побеждают файловые маршруты. Таблица занимает только свободные адреса.

Третье правило и делает таблицу безопасной для редактора: строка не может втихую отобрать адрес, который уже обслуживает ваш код.

Редирект ваш код всё-таки перебивает

Первое правило — исключение, и оно намеренное: увести адрес нужно уметь даже тогда, когда на нём что-то ещё отвечает. Если рабочая страница вдруг начала перенаправлять, ищите сперва в этой таблице, а потом в каталоге маршрутов.

Кэширование

Строки читаются один раз и кэшируются; модель сбрасывает этот кэш при сохранении и удалении маршрута, поэтому правка действует сразу.

Неудачное чтение — таблица ещё не мигрирована, база на секунду недоступна — не кэшируется. Иначе одна неудачная секунда во время деплоя заморозила бы пустой список маршрутов до следующей очистки кэша.

Когда лучше файл

Таблица — для адресов. Всё, где есть логика — условия, параметры, проверки доступа, — живёт в core/App/routes/: там это видно в диффе и поддаётся проверке. См. Маршрутизацию.

© PageBlocks 2019-present