Cómo reescribir URL con mod_rewrite para Apache en Debian 10

Introducción
El módulo de Apache mod_rewrite
le permite reescribir las URL de una manera más clara, traduciendo rutas legibles para humanos en cadenas de consulta fáciles de usar. También le permite reescribir las URL en función de condiciones.
Un .htaccess
archivo le permite crear y aplicar reglas de reescritura sin acceder a los archivos de configuración del servidor. Al colocar el .htaccess
archivo en la raíz de su sitio web, puede administrar las reescrituras por sitio o por directorio.
En este tutorial, habilitará mod_rewrite
y usará .htaccess
archivos para crear una redirección de URL básica y luego explorará un par de casos de uso avanzados.
Prerrequisitos
Para seguir este tutorial, necesitarás:
-
Un servidor Debian 10 configurado siguiendo la guía de configuración inicial del servidor Debian 10, incluido un usuario sudo no root y un firewall.
-
Apache se instaló siguiendo los pasos 1 y 2 de Cómo instalar el servidor web Apache en Debian 10.
Paso 1: Habilitar mod_rewrite
Para que Apache comprenda las reglas de reescritura, primero debemos activarlo mod_rewrite
. Ya está instalado, pero está deshabilitado en una instalación predeterminada de Apache. Use el a2enmod
comando para habilitar el módulo:
- sudo a2enmod rewrite
Esto activará el módulo o le avisará que el módulo ya está habilitado. Para que estos cambios surtan efecto, reinicie Apache:
- sudo systemctl restart apache2
mod_rewrite
Ahora está completamente habilitado. En el siguiente paso, configuraremos un .htaccess
archivo que usaremos para definir reglas de reescritura para redirecciones.
Paso 2: Configuración de .htaccess
Un .htaccess
archivo nos permite modificar nuestras reglas de reescritura sin acceder a los archivos de configuración del servidor. Por este motivo, .htaccess
es fundamental para la seguridad de su aplicación web. El punto que precede al nombre del archivo garantiza que el archivo esté oculto.
Nota: Cualquier regla que pueda incluir en un .htaccess
archivo también se puede incluir directamente en los archivos de configuración del servidor. De hecho, la documentación oficial de Apache recomienda utilizar archivos de configuración del servidor en lugar de archivos de configuración del servidor .htaccess
, gracias a que los tiempos de procesamiento son más rápidos.
Sin embargo, en este ejemplo simple, el aumento de rendimiento será insignificante. Además, la configuración de reglas .htaccess
es conveniente, especialmente con varios sitios web en el mismo servidor. No es necesario reiniciar el servidor para que los cambios surtan efecto ni privilegios de root para editar las reglas, lo que simplifica el mantenimiento y el proceso de realizar cambios con una cuenta sin privilegios. Los programas de código abierto populares como WordPress y Joomla dependen de .htaccess
archivos para realizar modificaciones y reglas adicionales según sea necesario.
Antes de comenzar a utilizar .htaccess
archivos, deberá configurar y proteger algunas configuraciones más.
De forma predeterminada, Apache prohíbe el uso de un .htaccess
archivo para aplicar reglas de reescritura, por lo que primero debe permitir cambios en el archivo. Abra el archivo de configuración predeterminado de Apache con nano
su editor de texto favorito:
- sudo nano /etc/apache2/sites-available/000-default.conf
Dentro de ese archivo, encontrará un VirtualHost *:80
bloque que comienza en la primera línea. Dentro de ese bloque, agregue el siguiente bloque nuevo para que su archivo de configuración se vea como el siguiente. Asegúrese de que todos los bloques estén correctamente sangrados:
/etc/apache2/sites-available/000-default.conf
VirtualHost *:80 Directory /var/www/html Options Indexes FollowSymLinks AllowOverride All Require all granted /Directory . . ./VirtualHost
Guarde y cierre el archivo. Si utilizó nano
, hágalo presionando CTRL+X
, Y
y luego ENTER
.
Luego, verifica tu configuración:
- sudo apache2ctl configtest
Si no hay errores, reinicie Apache para que los cambios surtan efecto:
- sudo systemctl restart apache2
Ahora, crea un .htaccess
archivo en la raíz web:
- sudo nano /var/www/html/.htaccess
Agregue esta línea en la parte superior del nuevo archivo para activar el motor de reescritura.
/var/www/html/.htaccess
RewriteEngine on
Guarde el archivo y salga.
Ahora tienes un .htaccess
archivo operativo que puedes usar para controlar las reglas de enrutamiento de tu aplicación web. En el siguiente paso, crearemos un archivo de sitio web de muestra que usaremos para demostrar las reglas de reescritura.
Paso 3: configuración de reescrituras de URL
Aquí, configuraremos una reescritura de URL básica que convierte URLs bonitas en rutas reales a páginas. En concreto, permitiremos a los usuarios acceder a y mostrar una página llamada .http://your_server_ip/about
about.html
Comience creando un archivo llamado about.html
en la raíz web:
- sudo nano /var/www/html/about.html
Copie el siguiente código HTML en el archivo, luego guárdelo y ciérrelo.
/var/www/html/acercade.html
html head titleAbout Us/title /head body h1About Us/h1 /body/html
Puede acceder a esta página en , pero tenga en cuenta que si intenta acceder a , verá un error 404 No encontrado . Para acceder a la página usando en su lugar, crearemos una regla de reescritura.http://your_server_ip/about.html
http://your_server_ip/about
/about
Todos RewriteRules
siguen este formato:
Estructura general de RewriteRule
RewriteRule pattern substitution [flags]
RewriteRule
especifica la directiva.pattern
es una expresión regular que coincide con la cadena deseada de la URL, que es lo que el espectador escribe en el navegador.substitution
es la ruta a la URL real, es decir, la ruta del archivo que sirve Apache.flags
son parámetros opcionales que pueden modificar el funcionamiento de la regla.
Vamos a crear nuestra regla de reescritura de URL. Abra el .htaccess
archivo:
- sudo nano /var/www/html/.htaccess
Después de la primera línea, agregue lo siguiente RewriteRule
y guarde el archivo:
/var/www/html/.htaccess
RewriteEngine onRewriteRule ^about$ about.html [NC]
En este caso, ^about$
es el patrón, about.html
es la sustitución y [NC]
es una bandera. Nuestro ejemplo utiliza algunos caracteres con un significado especial:
^
indica el inicio de la URL, después deyour_server_ip/
.$
Indica el final de la URL.about
coincide con la cadena "acerca de".about.html
es el archivo real al que accede el usuario.[NC]
es una bandera que hace que la regla no distinga entre mayúsculas y minúsculas.
Ahora puedes acceder desde tu navegador. De hecho, con la regla mostrada arriba, las siguientes URL también apuntarán a :http://your_server_ip/about
about.html
http://your_server_ip/about
, debido a la definición de la regla.http://your_server_ip/About
, porque la regla no distingue entre mayúsculas y minúsculas.http://your_server_ip/about.html
, porque el nombre del archivo original siempre funcionará.
Sin embargo, lo siguiente no funcionará:
http://your_server_ip/about/
, porque la regla establece explícitamente que no puede haber nada después deabout
, ya que el$
carácter aparece después deabout
.http://your_server_ip/contact
, porque no coincidirá con laabout
cadena en la regla.
Ahora tienes un .htaccess
archivo operativo con una regla básica que puedes modificar y ampliar según tus necesidades. En las siguientes secciones, mostraremos dos ejemplos adicionales de directivas de uso común.
Ejemplo 1: simplificación de cadenas de consulta con RewriteRule
Las aplicaciones web suelen utilizar cadenas de consulta, que se añaden a una URL mediante un signo de interrogación ( ?
) después de la dirección. Los parámetros separados se delimitan mediante un ampersand ( ). Las cadenas de consulta se pueden utilizar para pasar datos adicionales entre páginas de aplicaciones individuales.
Por ejemplo, una página de resultados de búsqueda escrita en PHP puede utilizar una URL como http://example.com/results.php?item=shirtseason=summer
. En este ejemplo, se pasan dos parámetros adicionales al result.php
script de aplicación imaginario: item
, con el valor shirt
, y season
con el valor summer
. La aplicación puede utilizar la información de la cadena de consulta para crear la página correcta para el visitante.
Las reglas de reescritura de Apache se emplean a menudo para simplificar enlaces largos y desagradables como el ejemplo anterior y convertirlos en URL fáciles de escribir e interpretar visualmente. En este ejemplo, nos gustaría simplificar el enlace anterior para que se convierta en http://example.com/shirt/summer
. Los valores de los parámetros shirt
y summer
siguen estando en la dirección, pero sin la cadena de consulta ni el nombre del script.
Aquí hay una regla para implementar esto:
Sustitución simple
RewriteRule ^shirt/summer$ results.php?item=shirtseason=summer [QSA]
Se shirt/summer
coincide explícitamente con la dirección solicitada y se le indica a Apache que la sirva results.php?item=shirtseason=summer
en su lugar.
Las [QSA]
banderas se usan comúnmente en reglas de reescritura. Le indican a Apache que agregue cualquier cadena de consulta adicional a la URL proporcionada, de modo que si el visitante escribe, el servidor responderá con . Sin esto, la cadena de consulta adicional se descartaría.http://example.com/shirt/summer?page=2
results.php?item=shirtseason=summerpage=2
Si bien este método logra el efecto deseado, tanto el nombre del artículo como la temporada están codificados en la regla. Esto significa que la regla no funcionará para ningún otro artículo, como pants
, o temporada, como winter
.
Para que la regla sea más genérica, podemos usar expresiones regulares para hacer coincidir partes de la dirección original y usar esas partes en un patrón de sustitución. La regla modificada se verá así:
Sustitución simple
RewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1season=$2 [QSA]
El primer grupo de expresiones regulares entre paréntesis coincide con una cadena que contiene caracteres alfanuméricos y números como shirt
o pants
y guarda el fragmento coincidente como $1
variable. El segundo grupo de expresiones regulares entre paréntesis coincide exactamente con summer
, winter
, fall
, o spring
y, de manera similar, guarda el fragmento coincidente como $2
.
Luego, los fragmentos coincidentes se utilizan en la URL resultante en las variables item
y season
en lugar de los valores shirt
y codificados summer
que utilizamos antes.
Lo anterior se convertirá, por ejemplo, http://example.com/pants/summer
en http://example.com/results.php?item=pantsseason=summer
. Este ejemplo también es a prueba de futuro, ya que permite reescribir correctamente varios elementos y temporadas utilizando una sola regla.
Ejemplo 2: Cómo agregar condiciones con lógica usando RewriteConds
Las reglas de reescritura no siempre se evalúan necesariamente una por una sin limitaciones. La RewriteCond
directiva nos permite agregar condiciones a nuestras reglas de reescritura para controlar cuándo se procesarán las reglas. Todas RewriteConds
cumplen con el siguiente formato:
Estructura general de RewriteCond
RewriteCond TestString Condition [Flags]
RewriteCond
especifica laRewriteCond
directiva.TestString
es la cadena contra la cual se realizará la prueba.Condition
es el patrón o condición a coincidir.Flags
son parámetros opcionales que pueden modificar la condición y las reglas de evaluación.
Si a RewriteCond
se evalúa como verdadero, RewriteRule
se considerará la siguiente regla. Si no, se descartará la regla. RewriteConds
Se pueden usar varias reglas una tras otra, aunque todas deben evaluarse como verdaderas para que se considere la siguiente regla.
A modo de ejemplo, supongamos que desea redirigir todas las solicitudes a archivos o directorios inexistentes en su sitio a la página de inicio en lugar de mostrar la página de error estándar 404 Not Found . Esto se puede lograr con las siguientes reglas de condiciones:
Redirigir todas las solicitudes a archivos y directorios inexistentes a la página de inicio
RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule . /
Con lo anterior:
%{REQUEST_FILENAME}
es la cadena que se debe verificar. En este caso, es el nombre del archivo solicitado, que es una variable del sistema disponible para cada solicitud.-f
es una condición incorporada que verifica si el nombre solicitado existe en el disco y es un archivo. Es!
un operador de negación. En combinación,!-f
se evalúa como verdadero solo si el nombre especificado no existe o no es un archivo.- De manera similar,
!-d
se evalúa como verdadero solo si el nombre especificado no existe o no es un directorio.
El comando RewriteRule
en la última línea solo tendrá efecto en las solicitudes a archivos o directorios inexistentes. El RewriteRule
comando en sí es muy simple y redirige todas las solicitudes a la /
raíz del sitio web.
Conclusión
mod_rewrite
le permite crear URL legibles para humanos. En este tutorial, aprendió a usar la RewriteRule
directiva para redirigir URL, incluidas aquellas con cadenas de consulta. También aprendió a redirigir URL de manera condicional usando la RewriteCond
directiva.
Si desea obtener más información sobre mod_rewrite
, consulte la Introducción a mod_rewrite de Apache y la documentación oficial de Apache para mod_rewrite.
Deja una respuesta