Enrutamiento en Grav
Como ya describimos en la sección inicial de Páginas -> Carpetas, el enrutamiento en Grav se controla principalmente mediante la estructura de carpetas que utilizas al construir el contenido de tu sitio.
Hay ciertos escenarios donde necesitas más flexibilidad, y Grav viene equipado con diversas herramientas y opciones de configuración para facilitarte la vida en este aspecto.
Imagina que migras tu sitio desde otra plataforma CMS a Grav. Tienes varias opciones para configurar tu nuevo sitio:
- Intentar replicar las URLs de tu sitio antiguo construyendo una estructura de carpetas que coincida.
- Construir tu nuevo sitio como prefieras y hacer que tu servidor web 'reescriba' las URLs antiguas para redirigir a los clientes a las nuevas ubicaciones.
- Construir tu nuevo sitio como prefieras y configurar Grav para redirigir a los clientes desde las URLs antiguas a las nuevas.
Existen muchos otros casos de uso donde quizás desees que el sitio Grav responda a URLs diferentes a las que dicta la estructura de carpetas, y Grav tiene las siguientes capacidades para ayudarte a lograr tus objetivos.
Anulaciones de Ruta y Redirección a Nivel de Página
Como se describe en la sección Cabeceras -> Rutas, puedes proporcionar opciones de enrutamiento explícitas para la ruta por defecto así como un array de alias de ruta:
routes:
default: '/mi/pagina/ejemplo'
canonical: '/alias/url/canonica'
aliases:
- '/otra/ruta'
- '/puede-ser-cualquier-slug-valido'
Estos se procesan y almacenan en caché por página, y están disponibles junto con lo que llamamos la ruta cruda, que es la ruta basada en los slugs de la jerarquía de la página (que es cómo Grav calcula una ruta por defecto). Así que incluso si proporcionas rutas personalizadas para la página, la ruta cruda sigue siendo siempre válida también.
Similar al enrutamiento a nivel de página, Grav también soporta redirecciones a nivel de página especificando la página objetivo en la cabecera de la página. Consulta la sección Cabeceras -> Redirección para más detalles.
redirect: '/alguna/ruta/personalizada[303]'
Rutas y Redirecciones a Nivel de Sitio
Grav tiene un potente mecanismo basado en regex para manejar alias de ruta y redirecciones de una página a otra. Esta característica es particularmente útil cuando migras un sitio a Grav y quieres asegurarte de que las URLs antiguas seguirán funcionando con el nuevo sitio. Esto a menudo se logra mejor mediante reglas de reescritura usando tu servidor web, pero a veces es más conveniente y flexible dejar que Grav las maneje.
Esto se gestiona mediante la Configuración del Sitio. Grav viene con un archivo de ejemplo system/config/site.yaml
pero puedes sobrescribir o añadir cualquier configuración editando el archivo user/config/site.yaml
.
Todas las reglas de redirección se aplican en la parte del slug-path que comienza después del idioma (si usas páginas multi-idioma)
Debes escapar ciertos caracteres en cualquier ruta que quieras coincidir. Esto es especialmente importante si estás migrando un sitio antiguo que usaba enlaces con extensiones de archivo heredadas (ej. .php
) o parámetros de URL (?foo=bar
). En estos ejemplos, el punto y el signo de interrogación deben escaparse como /index\.php\?foo=bar: '/nueva/ubicacion'
.
Alias de Rutas
Alias Simples
El tipo más básico de alias es un mapeo directo uno a uno. En la sección routes:
del site.yaml
, puedes crear una lista de mapeos para indicar el alias y la ruta real que debe usarse.
Es importante notar que estos alias solo se usan si no se encuentra una página válida con la ruta proporcionada
routes:
/algo/mas: '/blog/enfoque-y-desenfoque'
Si solicitas una URL http://misitio.com/algo/mas
y esa no es una página válida, la definición de rutas te servirá la página ubicada en /blog/enfoque-y-desenfoque
, asumiendo que exista. Esto no redirige realmente al usuario a la página proporcionada, simplemente muestra la página cuando solicitas el alias.
La indentación es clave aquí, sin ella la redirección de ruta no funcionará.
Alias Basados en Regex
Un tipo más avanzado de alias de redirección permite el uso de un simple regex para mapear parte de un alias a una ruta. Por ejemplo, si tuvieras:
routes:
/otro/(.*): '/blog/$1'
Esto enrutaría el comodín del alias a la ruta, así que http://misitio.com/otro/enfoque-y-desenfoque
mostraría realmente la página encontrada en la ruta /blog/enfoque-y-desenfoque
. Esta es una forma poderosa de mapear un conjunto de URLs a otro. Ideal para mover tu sitio de WordPress a Grav :)
También puedes realizar la coincidencia para capturar cualquier alias, y mapearlo a una ruta específica:
routes:
/un-anillo/(.*): '/blog/sol-en-las-colinas'
Con este alias de ruta, cualquier URL que coincida con el comodín: /un-anillo/para-gobernarlos-a-todos
o /un-anillo/es-mio.html
mostrarán el contenido de la página con la ruta /blog/sol-en-las-colinas
.
Puedes incluso ser mucho más creativo y mapear múltiples elementos o usar cualquier sintaxis de regex:
routes:
/complejo/(categoria|seccion)/(.*): /blog/$1/carpeta/$2
Esto coincidiría y reescribiría lo siguiente:
/complejo/categoria/articulo-1 -> /blog/categoria/carpeta/articulo-1
/complejo/seccion/articulo-2.html -> /blog/seccion/carpeta/articulo-2.html
Esta ruta no coincidiría con nada que no empiece con complejo/categoria
o complejo/seccion
. Para más información, Regexr.com es un recurso fantástico para aprender y probar expresiones regulares.
Redirecciones
La otra opción correlativa a los alias de ruta la proporcionan las redirecciones. Estas son similares, pero en lugar de mantener la URL y simplemente servir el contenido desde la ruta aliaseada, Grav realmente redirige el navegador a la página mapeada.
Hay tres opciones de configuración a nivel de sistema que afectan a las Redirecciones:
pages:
redirect_default_route: false
redirect_default_code: 302
redirect_trailing_slash: true
redirect_default_route
permite a Grav redirigir automáticamente a la ruta por defecto de la página.redirect_default_code
te permite establecer los códigos HTTP de redirección por defecto:- 301: Redirección permanente. Los clientes que hagan solicitudes posteriores para este recurso deberían usar el nuevo URI. Los clientes no deberían seguir la redirección automáticamente para solicitudes POST/PUT/DELETE.
- 302: Redirección por razón no definida. Los clientes que hagan solicitudes posteriores para este recurso no deberían usar el nuevo URI. Los clientes no deberían seguir la redirección automáticamente para solicitudes POST/PUT/DELETE.
- 303: Redirección por razón no definida. Típicamente, 'La operación ha completado, continuar en otro lugar.' Los clientes que hagan solicitudes posteriores para este recurso no deberían usar el nuevo URI. Los clientes deberían seguir la redirección para solicitudes POST/PUT/DELETE.
- 307: Redirección temporal. El recurso puede volver a esta ubicación más adelante. Los clientes que hagan solicitudes posteriores para este recurso deberían usar el URI antiguo. Los clientes no deberían seguir la redirección automáticamente para solicitudes POST/PUT/DELETE.
redirect_trailing_slash
te permite redirigir a una versión sin barra final de la URL actual
Por ejemplo:
redirects:
/jungla: '/blog/la-jungla-urbana'
También puedes pasar explícitamente el código de redirección entre corchetes []
como parte de la URL:
redirects:
/jungla: '/blog/la-jungla-urbana[303]'
Si apuntas tu navegador a http://misitio.com/jungla
, serías redirigido y terminarías en la página: http://misitio.com/blog/la-jungla-urbana
.
Las mismas capacidades de expresiones regulares que existen para los Alias de Ruta, también existen para las Redirecciones. Por ejemplo:
redirects:
/prueba-redireccion/(.*): /$1
/complejo/(categoria|seccion)/(.*): /blog/$1/carpeta/$2
Estos se ven casi idénticos a la versión de Alias de Ruta, pero en lugar de mostrar transparentemente la nueva página, Grav realmente redirige el navegador y carga la nueva página específicamente.
Ocultando la Ruta de Inicio
Cuando estableces una página determinada como inicio de tu sitio mediante el archivo system.yaml
:
home:
alias: '/inicio'
Estás indicando efectivamente a Grav que añada una ruta de /
como alias para esa página. Esto significa que cuando Grav solicita la página para la URL /
, encuentra la página que has establecido.
Sin embargo, Grav realmente no hace nada especial para las páginas que están debajo de esta página de inicio. Así que si tienes una página llamada /blog
que muestra una lista de tus entradas de blog, y la estableces como tu página de inicio, funcionará como se espera. Pero si haces clic en una entrada de blog que está bajo la carpeta /blog
, la URL podría ser /blog/mi-entrada-de-blog
. Este es el comportamiento esperado, pero puede que no sea lo que pretendías. Hay una nueva opción disponible mediante el system.yaml
que te permite ocultar este nivel superior /blog
de la ruta si así se habilita.
Puedes habilitar este comportamiento alternando el siguiente valor:
home:
hide_in_urls: true