Cuando un usuario introduce una URL específica en un navegador y pulsa Intro, el servidor web que recibe la petición intenta encontrar un archivo en el servidor en la ruta especificada en la URL. Si no se encuentra nada en la ruta, se abre un archivo índice como index.html o index.php. si no se encuentra nada, se devuelve un error 404. No tendríamos URL bonitas y fáciles de entender si las cosas no funcionaran como lo hacen ahora. Estas URL se utilizan en muchos sitios. El módulo apache mod rewrite está diseñado para resolver este problema En este tutorial veremos cómo habilitarlo.
Si todo funcionara como se describe, entonces al abrir cualquier enlace de este sitio en el directorio raíz debería existir un archivo o script con el mismo nombre de la barra de direcciones. Pero no es así. Al solicitar esta URL, el servidor web hace intentos de encontrar dicho archivo, pero si no lo encuentra, en lugar de devolver un error 404, pasa el control al módulo mod_rewrite, que para todas esas URL ejecuta el script index.php, pasándole la cadena de consulta después del dominio. PHP utiliza entonces estos datos para encontrar y devolver la página que el usuario necesita.
Para activar mod rewrite ejecute un simple comando:
$ sudo a2enmod rewrite
Después de reiniciar el servidor web:
$ sudo systemctl restart apache
El hecho de que el módulo esté habilitado a nivel del servidor web Apache no significa que vaya a funcionar para un sitio web. Para ello, se debe configurar en el archivo .htaccess, especificar en que script pasar las peticiones a páginas inexistentes. Para que el archivo .htaccess funcione, debe añadirse la directiva AllowOwerride: All
a la sección Directory del host virtual
A modo de ejemplo:
A continuación, por ejemplo, en WordPress es necesario añadir líneas como esta al archivo .htaccess:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
Todo el código se coloca en la directiva IfModule, permitiendo que el código dentro de ella se ejecute sólo cuando el módulo mod_rewrite está habilitado, de lo contrario estas líneas son simplemente ignoradas. La directiva RewriteEngine On habilita el módulo para el directorio actual. Luego RewriteBase especifica que toda la cadena después del dominio debe ser pasada al script. A continuación vienen las reglas RwriteRule con las condiciones para ellas RewriteCond, que se ejecuta de forma estrictamente secuencial.
Una de las reglas RewriteRule ^index .php$ - [L]
dice que si la URL contiene index.php, la URL debe reescribirse a /. En esta expresión regular, se especifica la cadena completa y el punto se escapa con una barra invertida. La bandera [L
] significa que si la URL coincide con esta regla, no se deben comprobar las reglas siguientes. Una vez ejecutada esta regla, la URL se reescribirá y el servidor web asumirá que ha recibido la petición /, el análisis de reglas comenzará de nuevo y esta vez coincidirá con la última regla.
Las condiciones RewriteCond se aplican a todas las reglas posteriores. Así, RewriteCond %{REQUEST_FILENAME} !-f
y RewriteCond %{REQUEST_FILENAME} !-d
permiten que la última regla se ejecute sólo si la URL no es un archivo o carpeta. La última regla redirige todo al script ./index.php.
Si no puedes entender la configuración de mod_rewrite, vale la pena mirar qué está pasando dentro del servidor web durante tus redirecciones. Para ello en la configuración del host virtual del sitio, es necesario agregar esta línea.
Por ejemplo:
$ sudo vi /etc/apache2/sites-available/001-texts.conf
LogLevel warn rewrite:trace4
A continuación, en el archivo de registro, que se da en la directiva ErrorLog, verá todos los intentos del servidor web para convertir la URL de acuerdo a sus reglas y será capaz de entender lo que está haciendo mal. En este tutorial, hemos cubierto cómo habilitar Apache mod rewrite, así como cómo funciona todo y cómo buscar errores.