Маршруты и редиректы
Маршруты, созданные из менеджера, хранятся в pb_routes. Для всего, что контент-редактор должен уметь без правки файлов: перенести страницу, увести старый адрес, показать по адресу шаблон.
PageBlocks → Маршруты.
Поля строки
| Поле | Что это |
|---|---|
context | Контекст MODX, к которому относится маршрут |
method | HTTP-метод, по умолчанию GET |
uri | Адрес, без ведущего слэша |
type | Что происходит — см. ниже |
target | Куда: URL, шаблон, чанк или действие контроллера |
status | HTTP-статус для редиректа. По умолчанию 301 |
menuindex | Порядок, он же решает спор между равными |
published_at | Неопубликованный маршрут не существует |
Типы
| Тип | target — это | Что происходит |
|---|---|---|
redirect | URL | Перенаправление на него со статусом status |
redirect_controller | Controller@method | Адрес действия вычисляется по зарегистрированным маршрутам, дальше перенаправление |
controller | Controller@method | Запрос обрабатывает действие |
view | Шаблон MODX | Рендерится этот шаблон |
file_chunk | Файл Fenom из core/App/elements/ | Рендерится этот файл |
redirect_controller нужен, чтобы редирект пережил смену адреса: вы указываете на действие, а URL ищется в момент запроса. Если действие не разрешилось, строка пропускается, а не уводит куда попало.
301 по умолчанию — намеренно
Редирект, заведённый руками, почти всегда означает «этот адрес переехал насовсем». 302 говорит поисковику обратное и оставляет старый URL в индексе. Ставьте 302, только когда переезд действительно временный.
Кто побеждает
Маршруты приходят из двух мест — из файлов и из этой таблицы, — поэтому порядок зафиксирован:
- Редиректы побеждают всё для того же
GET-адреса. Файловый маршрут на этот адрес пропускается, откуда бы редирект ни пришёл — из файла или из таблицы. - Среди редиректов побеждает первый; дубли на один адрес отбрасываются, а не роняют диспетчер.
- Для
controller,viewиfile_chunkпобеждают файловые маршруты. Таблица занимает только свободные адреса.
Третье правило и делает таблицу безопасной для редактора: строка не может втихую отобрать адрес, который уже обслуживает ваш код.
Редирект ваш код всё-таки перебивает
Первое правило — исключение, и оно намеренное: увести адрес нужно уметь даже тогда, когда на нём что-то ещё отвечает. Если рабочая страница вдруг начала перенаправлять, ищите сперва в этой таблице, а потом в каталоге маршрутов.
Кэширование
Строки читаются один раз и кэшируются; модель сбрасывает этот кэш при сохранении и удалении маршрута, поэтому правка действует сразу.
Неудачное чтение — таблица ещё не мигрирована, база на секунду недоступна — не кэшируется. Иначе одна неудачная секунда во время деплоя заморозила бы пустой список маршрутов до следующей очистки кэша.
Когда лучше файл
Таблица — для адресов. Всё, где есть логика — условия, параметры, проверки доступа, — живёт в core/App/routes/: там это видно в диффе и поддаётся проверке. См. Маршрутизацию.