Para comprender qué mod_rewrite necesita primero comprender cómo funciona un servidor web. Un servidor web responde a las solicitudes HTTP . Una solicitud HTTP en su nivel más básico se ve así:
GET /foo/bar.html HTTP/1.1
Esta es la simple solicitud de un navegador a un servidor web que le solicita la URL /foo/bar.html
. Es importante destacar que no solicita un archivo , solo solicita una URL arbitraria. La solicitud también puede verse así:
GET /foo/bar?baz=42 HTTP/1.1
Esta es una solicitud igual de válida para una URL, y obviamente no tiene nada que ver con los archivos.
El servidor web es una aplicación que escucha en un puerto, acepta solicitudes HTTP que ingresan en ese puerto y devuelve una respuesta. Un servidor web es completamente libre de responder a cualquier solicitud de la forma que considere adecuada / de cualquier manera que haya configurado para responder. Esta respuesta no es un archivo, es una respuesta HTTP que puede o no tener algo que ver con archivos físicos en cualquier disco. Un servidor web no tiene que ser Apache, hay muchos otros servidores web que son solo programas que se ejecutan de manera persistente y están conectados a un puerto que responde a las solicitudes HTTP. Puedes escribir uno tú mismo. Este párrafo tenía la intención de divorciarte de cualquier noción de que las URL son iguales a los archivos, lo cual es realmente importante de entender. :)
La configuración predeterminada de la mayoría de los servidores web es buscar un archivo que coincida con la URL en el disco duro. Si la raíz del documento del servidor está configurada en, digamos, /var/www
puede ver si el archivo /var/www/foo/bar.html
existe y servirlo si es así. Si el archivo termina en ".php", invocará al intérprete PHP y luego devolverá el resultado. Toda esta asociación es completamente configurable; un archivo no tiene que terminar en ".php" para que el servidor web lo ejecute a través del intérprete PHP, y la URL no tiene que coincidir con ningún archivo en particular en el disco para que algo suceda.
mod_rewrite es una forma de reescribir el manejo interno de solicitudes. Cuando el servidor web recibe una solicitud de URL /foo/bar
, puede volver a escribir esa URL en otra cosa antes de que el servidor web busque un archivo en el disco para que coincida. Ejemplo simple:
RewriteEngine On
RewriteRule /foo/bar /foo/baz
Esta regla dice que siempre que una solicitud coincida con "/ foo / bar", vuelva a escribirla en "/ foo / baz". La solicitud se manejará como si se /foo/baz
hubiera solicitado en su lugar. Esto se puede usar para varios efectos, por ejemplo:
RewriteRule (.*) $1.html
Esta regla coincide con cualquier cosa ( .*
) y la captura ( (..)
), luego la reescribe para agregar ".html". En otras palabras, si /foo/bar
fue la URL solicitada, se manejará como si se /foo/bar.html
hubiera solicitado. Consulte http://regular-expressions.info para obtener más información sobre la coincidencia, captura y reemplazo de expresiones regulares.
Otra regla que se encuentra a menudo es esta:
RewriteRule (.*) index.php?url=$1
Esto, nuevamente, coincide con cualquier cosa y lo reescribe en el archivo index.php con la URL solicitada originalmente adjunta en el url
parámetro de consulta. Es decir, para todas y cada una de las solicitudes entrantes, el archivo index.php se ejecuta y este archivo tendrá acceso a la solicitud original $_GET['url']
, por lo que puede hacer lo que quiera con él.
Principalmente pones estas reglas de reescritura en el archivo de configuración de tu servidor web . Apache también le permite * ponerlos en un archivo llamado .htaccess
dentro de la raíz de su documento (es decir, al lado de sus archivos .php).
* Si lo permite el archivo de configuración principal de Apache; Es opcional, pero a menudo habilitado.
Lo mod_rewrite qué no hacer
mod_rewrite no hace mágicamente todas sus URL "bonitas". Este es un malentendido común. Si tiene este enlace en su sitio web:
<a href="https://stackoverflow.com/my/ugly/link.php?is=not&very=pretty">
no hay nada que mod_rewrite pueda hacer para que sea bonito. Para que este sea un enlace bonito, debes:
Cambie el enlace a un enlace bonito:
<a href="https://stackoverflow.com/my/pretty/link">
Use mod_rewrite en el servidor para manejar la solicitud a la URL /my/pretty/link
usando cualquiera de los métodos descritos anteriormente.
(Se podría usar mod_substitute
en conjunto para transformar las páginas HTML salientes y sus enlaces contenidos. Aunque esto suele ser más esfuerzo que solo actualizar sus recursos HTML).
Hay muchas cosas que mod_rewrite puede hacer y reglas de coincidencia muy complejas que puede crear, incluyendo encadenar varias reescrituras, enviar solicitudes a un servicio o máquina completamente diferente, devolver códigos de estado HTTP específicos como respuestas, redireccionar solicitudes, etc. Es muy poderoso y puede usarse para muy bueno si entiendes el mecanismo fundamental de solicitud-respuesta HTTP. No , no significa automáticamente que sus enlaces bonita.
Consulte la documentación oficial para ver todas las banderas y opciones posibles.