Cómo reescribir URL con mod_rewrite para Apache en Ubuntu 20.04

1 mar 2021 8 min di lettura
Cómo reescribir URL con mod_rewrite para Apache en Ubuntu 20.04
Indice dei contenuti

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á:

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:.htaccessdocumentació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:

<VirtualHost *:80>
 <Directory /var/www/html>
 Options Indexes FollowSymLinks
 AllowOverride All
 Require all granted
 </Directory>...
 </VirtualHost>
/etc/apache2/sites-available/000-default.conf

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:

RewriteEngine on
/var/www/html/.htaccess

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:

<html>
 <head>
 <title>About Us</title>
 </head>
 <body>
 <h1>About Us</h1>
 </body>
 </html>
/var/www/html/about.html

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:

RewriteEngine on
 RewriteRule ^about$ about.html [NC]
/var/www/html/.htaccess

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 de your_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 de about, ya que el $ aparece después de about.
  • http://your_server_ip/contact, porque no coincidirá con la about 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 directiva RewriteCond
  • 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

Buy me a coffeeBuy me a coffee

Supportaci se ti piacciono i nostri contenuti. Grazie.

Successivamente, completa il checkout per l'accesso completo a Noviello.it.
Bentornato! Accesso eseguito correttamente.
Ti sei abbonato con successo a Noviello.it.
Successo! Il tuo account è completamente attivato, ora hai accesso a tutti i contenuti.
Operazione riuscita. Le tue informazioni di fatturazione sono state aggiornate.
La tua fatturazione non è stata aggiornata.