Маршрутизация⚓︎
Как мы уже описывали в разделе Страница -> Папки, маршрутизация в Grav в первую очередь контролируется структурой папок, которую вы используете при создании контента вашего сайта.
Есть определённые сценарии, где вам нужна большая гибкость, и Grav поставляется с различными инструментами и вариантами конфигурации, чтобы сделать вашу жизнь проще в этом отношении.
Представьте себе, что если вы переместили свой сайт с какой-то другой платформы CMS на Grav, у вас есть несколько вариантов настройки вашего нового сайта:
- Попробуйте воспроизвести URL-адреса вашего старого сайта, построив соответствующую структуру папок.
- Создайте свой новый сайт так, как вы хотите, а затем попросите ваш веб-сервер «переписать» старые URL-адреса, чтобы перенаправить клиентов в новые места.
- Создайте свой новый сайт так, как вы хотите, и настройте Grav для перенаправления клиентов со старых URL-адресов в новые места.
Есть много других вариантов использования, когда вы можете захотеть, чтобы сайт Grav отвечал на URL-адреса, отличные от того, что диктует структура папок, и Grav имеет следующие возможности, которые помогут вам реализовать свои цели.
Переопределение маршрута на уровне страниц⚓︎
Как указано в разделе Заголовки -> Маршрутизация, вы можете предоставить явные опции маршрутизации для маршрута по умолчанию а также массив псевдонимов маршрутов:
routes:
default: '/my/example/page'
canonical: '/canonical/url/alias'
aliases:
- '/some/other/route'
- '/can-be-any-valid-slug'
Эти опции обрабатываются и кэшируются вместе со страницей, и доступны вместе с тем, что мы называем сырым маршрутом, который является маршрутом, основанным на слагах иерархии страниц (так Grav по умолчанию работает с маршрутом). Таким образом, даже если вы предоставляете маршруты по пользовательским страницам, сырой маршрут также всегда действителен.
Grav также поддерживает перенаправление на уровне страниц, указывая целевую страницу в заголовке страницы. См. раздел Заголовки -> Перенаправление для получения более подробной информации.
Маршруты и переадресации на уровне сайта⚓︎
Grav имеет мощный механизм на основе регулярных выражений для обработки псевдонимов маршрутов и перенаправлений с одной страницы на другую. Эта функция особенно полезна, когда вы переносите сайт в Grav и хотите убедиться, что старые URL-адреса всё ещё будут работать с новым сайтом. Это часто лучше всего достигается с помощью переписывания правил с помощью вашего веб-сервера, но иногда более удобно и гибко просто позволить Grav обрабатывать их.
Они обрабатываются через конфигурацию сайта. Grav поставляется с примером system/config/site.yaml
, но вы можете переопределить или добавить любые свои собственные настройки, отредактировав файл user/config/site.yaml
.
Все правила перенаправления применяются к слагу, начинающемуся после языковой части (если вы используете многоязычные страницы)
Вы должны экранировать определённые символы в любых маршрутах, которые вы хотите сопоставить. Это особенно важно знать, если вы переносите старый сайт, на котором использовались ссылки, содержащие устаревшие расширения файлов (например, .php
) или параметры URL (?foo=bar
). В этих примерах точка и вопросительный знак должны быть экранированы: /index\.php\?foo=bar: '/new/location'
.
Псевдонимы маршрута⚓︎
Простые псевдонимы⚓︎
Самый простой вид псевдонима — это прямое взаимно-однозначное сопоставление. В разделе routes:
файла site.yaml
вы можете создать список сопоставлений, чтобы указать псевдоним и фактический маршрут, который следует использовать.
Важно отметить, что эти псевдонимы используются только в том случае, если не найдена действительная страница с указанным маршрутом.
Если вы запросили URL-адрес http://mysite.com/something/else
, и это была недействительная страница, определение маршрутов фактически предоставит вам страницу, расположенную в /blog/focus-and-blur
, при условии, что она существует. На самом деле это не перенаправляет пользователя на предоставленную страницу, а просто отображает страницу, когда вы запрашиваете псевдоним.
Псевдонимы на основе регулярных выражений⚓︎
Более продвинутый тип перенаправления псевдонима позволяет использовать простое регулярное выражение для сопоставления части псевдонима с маршрутом. Например, если у вас были:
При этом подстановочный символ будет перемещаться от псевдонима к маршруту, так что http://mysite.com/another/focus-and-blur
на самом деле отобразит страницу, найденную в маршруте /blog/focus-and-blur
. Это мощный способ сопоставить один набор URL-адресов с другим. Отлично подходит для переноса вашего сайта с WordPress на Grav :)
Вы также можете использовать регулярное выражение, чтобы захватить любой псевдоним, и сопоставить его с определённым маршрутом:
С этим псевдонимом маршрута, любые URL, соответствующие подстановочному знаку /one-ring/to-rule-them-all
или /one-ring/is-mine.html
, отобразят содержимое страницы с маршрутом /blog/sunshine-in-the-hills
.
Вы даже можете подойти более творчески и отобразить несколько элементов или использовать любой синтаксис регулярных выражений:
Это совпало бы и переписало бы следующее:
/complex/category/article-1 -> /blog/category/folder/article-1
/complex/section/article-2.html -> /blog/section/folder/article-2.html
Этот маршрут не будет соответствовать тому, что не начинается с complex/category
или complex/section
. Для получения дополнительной информации посетите Regexr.com — отличный ресурс для изучения и тестирования регулярных выражений.
Перенаправления⚓︎
Другой вариант следствия для псевдонимов маршрутов предоставляется перенаправлениями. Они похожи, но вместо того, чтобы сохранять URL и просто обслуживать контент из маршрута с псевдонимом, Grav фактически перенаправляет браузер на сопоставленную страницу.
На перенаправления влияют три параметра конфигурации на системном уровне:
redirect_default_route
позволяет Grav автоматически перенаправлять на маршрут страницы по умолчанию.redirect_default_code
позволяет установить коды перенаправления HTTP по умолчанию:- 301: Постоянное перенаправление. Клиенты, выполняющие последующие запросы для этого ресурса, должны использовать новый URI. Клиенты не должны автоматически выполнять перенаправление для запросов POST/PUT/DELETE.
- 302: Перенаправление по неопределенной причине. Клиенты, выполняющие последующие запросы для этого ресурса, не должны использовать новый URI. Клиенты не должны автоматически выполнять перенаправление для запросов POST/PUT/DELETE.
- 303: Переориентация по неопределённой причине. Как правило, "Операция завершена, продолжается в другом месте". Клиенты, делающие последующие запросы на этот ресурс, не должны использовать новый URI. Клиенты должны следовать перенаправлению для POST/PUT/DELETE запросов.
- 307: Временная переадресация. Ресурс может вернуться в это место позже. Клиенты, делающие последующие запросы на этот ресурс, должны использовать старый URI. Клиенты не должны автоматически переадресовывать запросы POST/PUT/DELETE.
- Опция
redirect_trailing_slash
позволяет вам перенаправить на не трейлинговую косую версию текущего URL.
Пример:
Вы также можете явно передавать код перенаправления между квадратными скобками []
как часть URL:
Если бы вы указали своему браузеру на http://mysite.com/jungle
, вы бы на самом деле оказались на странице http://mysite.com/blog/the-urban-jungle
.
Те же возможности регулярных выражений, которые существуют для псевдонимов маршрута, существуют и для переадресаций. Например:
Они выглядят почти идентично версии Route Alias, но вместо того, чтобы прозрачно показывать новую страницу, Grav фактически перенаправляет браузер и загружает новую страницу специально.
Скрытие маршрута Home⚓︎
Когда вы устанавливаете определенную страницу в качестве домашней страницы вашего сайта через файл system.yaml
:
Вы фактически говорите Grav добавить маршрут /
в качестве псевдонима для этой страницы. Это означает, что когда Grav запрашивает страницу для URL-адреса /
, он находит страницу, которую вы установили.
Однако Grav на самом деле не делает ничего особенного для страниц, находящихся под этой домашней страницей. Итак, если у вас есть страница с именем /blog
, которая отображает список ваших сообщений в блоге, и вы устанавливаете её как свою домашнюю страницу, она будет работать должным образом. Однако, если вы нажмете на сообщение в блоге, которое находится под папкой /blog
, URL-адресом может быть /blog/my-blog-post
. Это ожидаемое поведение, но это может быть не то, что вы намеревались. Есть новая опция, доступная через system.yaml
, которая позволяет вам скрыть этот верхний уровень /blog
от маршрута, если он включен.
Вы можете включить это поведение, переключив следующее значение: