Cómo realizar la redirección interna con mod_rewrite en Apache


En este artículo y en el siguiente explicaremos cómo usar mod_rewrite, para mapear ciertas solicitudes HTTP a otras páginas en un sitio web, oa una URL externa.

En otras palabras, este conocido módulo de Apache te permitirá redirigir una URL a otra, que ilustraremos a través de ejemplos prácticos.

NOTA: Los ejemplos siguientes asumen que está al menos algo familiarizado con Expresiones regulares compatibles con Perl (PCRE). Dado que ese tema está fuera del alcance de este artículo, consulte los documentos de Perl 5 versión 24.0 para obtener más detalles sobre PCRE.

Antes de continuar, asegúrese de que el módulo de reescritura esté cargado. Aunque este es el comportamiento predeterminado en CentOS y distribuciones similares, en Debian y derivados deberá cargarlo manualmente de la siguiente manera:

# a2enmod rewrite

Configuración de Apache para usar el módulo mod_rewrite

Para simplificar, usemos el sitio predeterminado en un cuadro de CentOS 7 (IP 192.168.0.100) para explicar cómo usar mod_rewrite (DocumentRoot:/var/www/html, archivo de configuración: /etc/httpd/conf/httpd.conf).

Para que Apache use este módulo, agregue la siguiente línea al archivo de configuración:

RewriteEngine on

Es importante tener en cuenta que esta configuración no será heredada por los hosts virtuales en el mismo cuadro.

Por lo tanto, deberá agregar RewriteEngine para cada host virtual donde desee usar reglas de reescritura.

Una redirección interna es el ejemplo más simple de mod_rewrite. Si desea redirigir todas las solicitudes de default.aspx a index.html, agregue la siguiente línea (también conocida como regla de reescritura) en RewriteEngine en:

RewriteRule "^/default\.aspx$" "/index.html"

y no olvide reiniciar Apache para que los cambios surtan efecto.

Esto puede resultar útil si su sitio se diseñó originalmente con ASP y luego se cambió a HTML5 simple. Los motores de búsqueda tendrán el archivo .aspx indexado, pero ese archivo ya no existe.

En ese caso, deberá encontrar una forma de redirigir la solicitud para que sus posibles visitantes no se encuentren con una página de error. Para probar, creemos un archivo HTML simple llamado index.html dentro de/var/www/html con el siguiente contenido:

<!DOCTYPE html>
<html>
  <head>
	<meta charset="utf-8">
	<title>New site</title>
  </head>
  <body>
	<h2>Default.aspx was here, but now it's index.html</h2>
  </body>
</html>

Los signos de intercalación y dólar harán que la expresión regular coincida con cualquier cadena que comience con /default y termine con .aspx , respectivamente.

Ahora inicie su navegador y apúntelo a 192.168.0.100/default.aspx. Si las cosas salen como se esperaba, Apache debería mostrar index.html en su lugar.
Sin embargo, el usuario final seguirá viendo default.aspx en la barra de direcciones, lo que hace que el cambio sea totalmente transparente:

Si desea que la URL en la barra de direcciones muestre que el servidor en realidad está sirviendo index.html en lugar de una página llamada default.aspx , agregue [R, L] al final de la regla de reescritura de la siguiente manera:

RewriteRule "^/default\.aspx$" "/index.html" [R,L]

Aquí, [R, L] son dos banderas opcionales que indican que se debe emitir un redireccionamiento HTTP completo al navegador (R) y que no se deben procesar más reglas:

Observe cómo la barra de direcciones ahora muestra index.html , como se esperaba, en lugar de default.aspx como lo hacía antes.

En este artículo explicamos cómo usar mod_rewrite para realizar redirecciones internas. Estén atentos para la próxima publicación donde aprenderemos cómo redirigir a un recurso que se ha movido a un servidor diferente y cómo reescribir banderas.

Como siempre, no dude en utilizar el formulario de comentarios a continuación si tiene alguna pregunta o comentario sobre este artículo. ¡Esperamos con interés escuchar de usted!