Перейти к содержанию

Маршрутизация⚓︎

Как мы уже описывали в разделе Страница -> Папки, маршрутизация в Grav в первую очередь контролируется структурой папок, которую вы используете при создании контента вашего сайта.

Есть определённые сценарии, где вам нужна большая гибкость, и Grav поставляется с различными инструментами и вариантами конфигурации, чтобы сделать вашу жизнь проще в этом отношении.

Представьте себе, что если вы переместили свой сайт с какой-то другой платформы CMS на Grav, у вас есть несколько вариантов настройки вашего нового сайта:

  1. Попробуйте воспроизвести URL-адреса вашего старого сайта, построив соответствующую структуру папок.
  2. Создайте свой новый сайт так, как вы хотите, а затем попросите ваш веб-сервер «переписать» старые URL-адреса, чтобы перенаправить клиентов в новые места.
  3. Создайте свой новый сайт так, как вы хотите, и настройте 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 также поддерживает перенаправление на уровне страниц, указывая целевую страницу в заголовке страницы. См. раздел Заголовки -> Перенаправление для получения более подробной информации.

redirect: '/some/custom/route[303]'

Маршруты и переадресации на уровне сайта⚓︎

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 вы можете создать список сопоставлений, чтобы указать псевдоним и фактический маршрут, который следует использовать.

Важно отметить, что эти псевдонимы используются только в том случае, если не найдена действительная страница с указанным маршрутом.

routes:
  /something/else: '/blog/focus-and-blur'

Если вы запросили URL-адрес http://mysite.com/something/else, и это была недействительная страница, определение маршрутов фактически предоставит вам страницу, расположенную в /blog/focus-and-blur, при условии, что она существует. На самом деле это не перенаправляет пользователя на предоставленную страницу, а просто отображает страницу, когда вы запрашиваете псевдоним.

Псевдонимы на основе регулярных выражений⚓︎

Более продвинутый тип перенаправления псевдонима позволяет использовать простое регулярное выражение для сопоставления части псевдонима с маршрутом. Например, если у вас были:

routes:
   /another/(.*): '/blog/$1'

При этом подстановочный символ будет перемещаться от псевдонима к маршруту, так что http://mysite.com/another/focus-and-blur на самом деле отобразит страницу, найденную в маршруте /blog/focus-and-blur. Это мощный способ сопоставить один набор URL-адресов с другим. Отлично подходит для переноса вашего сайта с WordPress на Grav :)

Вы также можете использовать регулярное выражение, чтобы захватить любой псевдоним, и сопоставить его с определённым маршрутом:

routes:
  /one-ring/(.*): '/blog/sunshine-in-the-hills'

С этим псевдонимом маршрута, любые URL, соответствующие подстановочному знаку /one-ring/to-rule-them-all или /one-ring/is-mine.html, отобразят содержимое страницы с маршрутом /blog/sunshine-in-the-hills.

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

routes:
  /complex/(category|section)/(.*): /blog/$1/folder/$2

Это совпало бы и переписало бы следующее:

/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 фактически перенаправляет браузер на сопоставленную страницу.

На перенаправления влияют три параметра конфигурации на системном уровне:

pages:
  redirect_default_route: false
  redirect_default_code: 302
  redirect_trailing_slash: true
  • 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.

Пример:

redirects:
    /jungle: '/blog/the-urban-jungle'

Вы также можете явно передавать код перенаправления между квадратными скобками [] как часть URL:

redirects:
    /jungle: '/blog/the-urban-jungle[303]'

Если бы вы указали своему браузеру на http://mysite.com/jungle, вы бы на самом деле оказались на странице http://mysite.com/blog/the-urban-jungle.

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

redirects:
    /redirect-test/(.*): /$1
    /complex/(category|section)/(.*): /blog/$1/folder/$2

Они выглядят почти идентично версии Route Alias, но вместо того, чтобы прозрачно показывать новую страницу, Grav фактически перенаправляет браузер и загружает новую страницу специально.

Скрытие маршрута Home⚓︎

Когда вы устанавливаете определенную страницу в качестве домашней страницы вашего сайта через файл system.yaml:

home:
  alias: '/home'

Вы фактически говорите Grav добавить маршрут / в качестве псевдонима для этой страницы. Это означает, что когда Grav запрашивает страницу для URL-адреса /, он находит страницу, которую вы установили.

Однако Grav на самом деле не делает ничего особенного для страниц, находящихся под этой домашней страницей. Итак, если у вас есть страница с именем /blog, которая отображает список ваших сообщений в блоге, и вы устанавливаете её как свою домашнюю страницу, она будет работать должным образом. Однако, если вы нажмете на сообщение в блоге, которое находится под папкой /blog, URL-адресом может быть /blog/my-blog-post. Это ожидаемое поведение, но это может быть не то, что вы намеревались. Есть новая опция, доступная через system.yaml, которая позволяет вам скрыть этот верхний уровень /blog от маршрута, если он включен.

Вы можете включить это поведение, переключив следующее значение:

home:
  hide_in_urls: true