Introducción
mod_rewrite
permite reescribir URL de manera más limpia, traduciendo rutas legibles por humanos en cadenas de consulta compatibles con el código. También le permite reescribir URL según las condiciones.
Un .htaccess
permite crear y aplicar reglas de reescritura sin acceder a los archivos de configuración del servidor. Al colocar el .htaccess
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
para crear una redirección de URL básica, luego explorará un par de casos de uso avanzados.
Si desea instalar mod_rewrite para Apache en un servidor remoto, siga leyendo; de lo contrario, omita el primer párrafo "Conectando al servidor" y lea el siguiente.
Conexión al servidor
Para acceder al servidor, necesita conocer la dirección IP. También necesitará su nombre de usuario y contraseña para la autenticación. Para conectarse al servidor como root, escriba el siguiente comando:
ssh root@IP_DEL_SERVER
A continuación, deberá ingresar la contraseña del usuario root.
Si no usa el usuario root, puede iniciar sesión con otro nombre de usuario usando el mismo comando, luego cambie root a su nombre de usuario:
ssh nome_utente@IP_DEL_SERVER
Luego se le pedirá que ingrese su contraseña de usuario.
El puerto estándar para conectarse a través de ssh es 22, si su servidor usa un puerto diferente, deberá especificarlo usando el parámetro -p, luego escriba el siguiente comando:
ssh nome_utente@IP_DEL_SERVER -p PORTA
Prerrequisitos
Para seguir este tutorial, necesitará:
- Un servidor Ubuntu 20.04 LTS Focal Fossa configurado siguiendo la guía de configuración del servidor inicial de Ubuntu 20.04, que incluye un usuario sudo no root y un firewall.
- Apache instalado siguiendo el paso 1 de Cómo instalar Linux, Apache, MySQL, PHP stack (LAMP) en Ubuntu 20.04.
Activar el módulo mod_rewrite
Para que Apache entienda las reglas de reescritura, primero debemos activar mod_rewrite
. Ya está instalado de forma predeterminada, pero está deshabilitado en una instalación de Apache predeterminada. Utilice el a2enmod
para habilitar el módulo:
sudo a2enmod rewrite
Esto activará el módulo o le notificará 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
que usaremos para definir las reglas de reescritura para redireccionamientos.
Configurar el archivo.htaccess
Un .htaccess
nos permite modificar nuestras reglas de reescritura sin acceder a los archivos de configuración del servidor. Por esta razón, .htaccess
es esencial para la seguridad de su aplicación web. El período anterior al nombre del archivo garantiza que el archivo esté oculto.
Nota:.htaccess
documentación oficial de Apache.htaccess.htaccess.htaccess
Antes de comenzar a usar .htaccess
, debe configurar y asegurar algunas otras configuraciones.
De forma predeterminada, Apache prohíbe el uso de un .htaccess
para hacer cumplir las reglas de reescritura, por lo que primero debe permitir cambios en el archivo. Abra el archivo de configuración de Apache predeterminado usando nano
o su editor de texto favorito:
sudo nano /etc/apache2/sites-available/000-default.conf
Dentro de ese archivo, encontrará un <VirtualHost *:80>
comenzando desde la primera línea. Dentro de ese bloque, agregue el siguiente bloque nuevo para que su archivo de configuración tenga el siguiente aspecto. Asegúrese de que todos los bloques estén correctamente sangrados:
Guarde y cierre el archivo. Para que estos cambios surtan efecto, reinicie Apache:
sudo systemctl restart apache2
Ahora, cree un .htaccess
en el archivo webroot:
sudo nano /var/www/html/.htaccess
Agregue esta línea al comienzo del nuevo archivo para activar el motor de reescritura:
Guarda el archivo y cierra.
Ahora tenemos un .htaccess
que podemos usar para gobernar las reglas de enrutamiento de nuestra aplicación web. En el siguiente paso, crearemos archivos de sitios web de muestra que usaremos para demostrar las reglas de reescritura.
Configurar reescrituras de URL
Aquí, configuraremos una reescritura de URL básica que convierte URL bonitas en rutas de página reales. Específicamente, permitiremos que los usuarios inicien sesión, pero http://your_server_ip/aboutabout.html
.
Comience creando un archivo llamado about.html
en webroot:
sudo nano /var/www/html/about.html
Copie el siguiente código HTML en el archivo, luego guárdelo y ciérrelo:
Puede acceder a esta página en http://your_server_ip/about.html
, pero tenga en cuenta que si intenta acceder a http://your_server_ip/about
, verá un error 404 No encontrado. Para acceder a la página usando /about
, crearemos una regla de reescritura.
Todas las RewriteRules
siguen este formato:
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 URL real, que es la ruta al servidor de archivos Apache.flags
: son parámetros opcionales que pueden cambiar el comportamiento de la regla.
Creemos nuestra regla de reescritura de URL. Abra el archivo .htaccess
sudo nano /var/www/html/.htaccess
Después de la primera línea, agregue el RewriteRule
resaltado y guarde el archivo:
En este caso, ^about$
es el patrón, about.html
es el reemplazo y [NC]
es una bandera. Nuestro ejemplo usa 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 "about".about.html
: es el archivo real al que accede el usuario.[NC]
: es un indicador que hace que la regla no sea sensible a las mayúsculas y minúsculas.
Ahora puede acceder a http://your_server_ip/aboutabout.html
en su navegador. De hecho, con la regla que se muestra arriba, las siguientes URL apuntarán a:
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 de archivo original correcto 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$
aparece después deabout
.http://your_server_ip/contact
, porque no coincidirá con laabout
en la regla.
Ahora tiene un .htaccess
con una regla básica que puede modificar y ampliar según sus necesidades. En las siguientes secciones, mostraremos dos ejemplos más de directivas de uso común.
Simplifique las 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 usar una URL como http://example.com/results.php?item=shirt&season=summer
. En este ejemplo, se pasan dos parámetros adicionales al result.php
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 adecuada para el visitante.
Las reglas de reescritura de Apache se emplean a menudo para simplificar enlaces tan largos y antiestéticos como los anteriores en URL amigables que son más fáciles de escribir e interpretar visualmente. En este ejemplo, nos gustaría simplificar el enlace del ejemplo anterior y hacer que se vea como http://example.com/shirt/summer
. Los valores de los shirt
y summer
todavía están en la dirección, pero sin la cadena de consulta y el nombre del script.
Aquí hay una regla para implementar este mecanismo:
RewriteRule ^shirt/summer$ results.php?item=shirt&season=summer [QSA]
El valor shirt/summer
se hace coincidir explícitamente en la dirección solicitada y, en su lugar, se le dice a Apache que results.php?item=shirt&season=summer
.
[QSA]
se utilizan comúnmente en las reglas de reescritura. Le dicen a Apache que agregue cualquier cadena de consulta adicional a la URL servida, por lo que si el visitante escribe http://example.com/shirt/summer?page=2
el servidor responderá results.php?item=shirt&season=summer&page=2
. Sin él, se eliminaría la cadena de consulta adicional.
Aunque 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 otros elementos, como pants
o temporadas, como winter
.
Para hacer la regla más genérica, podemos usar expresiones regulares para hacer coincidir partes de la dirección original y usar esas partes en un esquema de reemplazo. La regla modificada aparecerá de la siguiente manera:
RewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&season=$2 [QSA]
El primer conjunto 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 correspondiente como una variable de $1
El segundo grupo de expresiones regulares entre paréntesis coincide summer
, winter
, fall
o spring
, y guarda el fragmento coincidente como $2
.
Los fragmentos correspondientes se utilizan en la URL resultante en item
y season
lugar de los valores de shirt
summer
valores de verano utilizados anteriormente.
Lo anterior convertirá, por ejemplo, http://example.com/pants/summer
en http://example.com/results.php?item=pants&season=summer
. Este ejemplo también es una prueba para el futuro, lo que le permite reescribir correctamente varios artículos y temporadas usando una sola regla.
Agregue condiciones con lógica usando RewriteConds
Las reglas de reescritura no siempre se evalúan necesariamente una por una sin limitaciones. La RewriteCond
nos permite agregar condiciones a nuestras reglas de reescritura para controlar cuándo se procesan las reglas. Todas RewriteConds
condiciones de RewriteConds cumplen con el siguiente formato:
Estructura general de RewriteCond:
RewriteCond TestString Condition [Flags]
RewriteCond
: especifica la directivaRewriteCond
TestString
: es la cadena para probar.Condition
: es el modelo o la condición que debe coincidir.Flags
: son parámetros opcionales que pueden modificar la condición y las reglas de evaluación.
Si RewriteCond
devuelve verdadero, la siguiente RewriteRule
De lo contrario, la regla se descartará. Se RewriteCond
varios RewriteCond uno tras otro y, con el comportamiento predeterminado, todos deben evaluarse como verdaderos para que se considere la siguiente regla.
Por 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 404 No encontrado estándar. Esto se puede lograr con las siguientes reglas de condición.
Redirija todas las solicitudes a archivos y directorios inexistentes en la página de inicio:
RewriteCond %{REQUEST_FILENAME}!-f
RewriteCond %{REQUEST_FILENAME}!-d
RewriteRule. /[R=301]
Con lo anterior:
%{REQUEST_FILENAME}
: es la cadena para verificar. En este caso, es el nombre del archivo solicitado, que es una variable de 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.!
El! es un operador de negación. Combinado!-f
devuelve verdadero solo si un nombre especificado no existe o no es un archivo.- Del mismo modo
!-d
devuelve verdadero solo si un nombre especificado no existe o no es un directorio.
La última línea RewriteRule
solo tendrá efecto para solicitudes a archivos o directorios inexistentes. RewriteRule
sí es muy simple. El punto .
en el patrón coincide con cualquier cosa y el reemplazo enruta cada solicitud a la raíz /
del sitio web.
Además, la marca [R=301]
le dice a Apache que devuelva un 301 Moved Permanently
al navegador, de modo que el navegador sepa que se ha producido la redirección y recupera explícitamente la raíz del sitio web en lugar de la URL solicitada, con el cambio reflejado. en la barra de direcciones del navegador.
Sin esta bandera, Apache devolvería el contenido de la raíz del sitio web, pero el navegador aún pensaría que existe la URL de la página solicitada y mostraría la dirección solicitada originalmente en la barra de direcciones.
Conclusión
mod_rewrite
permite crear URL legibles por el usuario. En este tutorial, usó la RewriteRule
para redirigir URL, incluidas aquellas con Query Strings. También escribió la redirección de URL condicional utilizando la directiva RewriteCond