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

Índice
  1. Introducción
  • Prerrequisitos
  • Paso 1: Habilitar mod_rewrite
  • Paso 2: Configuración.htaccess
  • Paso 3: configuración de reescrituras de URL
  • Ejemplo 1: simplificación de cadenas de consulta con RewriteRule
  • Ejemplo 2: Cómo agregar condiciones con lógica usando RewriteConds
  • El autor seleccionó el Fondo de Diversidad en Tecnología para recibir una donación como parte del programa Write for DOnations .

    Introducción

    El módulo de Apache mod_rewritele permite reescribir las URL de forma más clara, traduciendo rutas legibles para humanos en cadenas de consulta fáciles de usar. También le permite reescribir las URL en función de condiciones.

    Un .htaccessarchivo le permite crear y aplicar reglas de reescritura sin acceder a los archivos de configuración del servidor. Al colocar el .htaccessarchivo en la raíz de su sitio web, puede administrar las reescrituras por sitio o por directorio.

    En este tutorial, habilitará mod_rewritey usará .htaccessarchivos para crear una redirección de URL básica y luego explorará un par de casos de uso avanzados.

    Prerrequisitos

    Para seguir este tutorial, necesitarás:

    • Un servidor Ubuntu 22.04 configurado siguiendo la guía de configuración inicial del servidor Ubuntu 22.04 , incluido un usuario sudo no root y un firewall.

    • Apache se instaló siguiendo el Paso 1 de Cómo instalar la pila Linux, Apache, MySQL, PHP (LAMP) en Ubuntu 22.04 .

    Paso 1: Habilitar mod_rewrite

    Para que Apache comprenda las reglas de reescritura, primero debe activarlo mod_rewrite. Ya está instalado, pero está deshabilitado en una instalación predeterminada de Apache. Use el a2enmodcomando para habilitar el módulo:

    1. sudo a2enmod rewrite

    Esto activará el módulo o le avisará que el módulo ya está habilitado. Para que estos cambios surtan efecto, reinicie Apache.

    1. sudo systemctl restart apache2

    mod_rewriteAhora está completamente habilitado. En el siguiente paso, configurará un .htaccessarchivo que usará para definir reglas de reescritura para redirecciones.

    Paso 2: Configuración.htaccess

    Un .htaccessarchivo nos permite modificar las reglas de reescritura sin acceder a los archivos de configuración del servidor. Por este motivo, .htaccesses fundamental para la seguridad de su aplicación web. El punto que precede al nombre del archivo garantiza que el archivo esté oculto.

    Nota: Cualquier regla que pueda incluir en un .htaccessarchivo también se puede incluir directamente en los archivos de configuración del servidor. De hecho, la documentación oficial de Apache recomienda utilizar archivos de configuración del servidor en lugar de archivos de configuración del servidor, .htaccessya que de esa manera Apache los procesa más rápido.

    Sin embargo, en este ejemplo sencillo, el aumento de rendimiento será insignificante. Además, la configuración de reglas .htaccesses conveniente, especialmente con varios sitios web en el mismo servidor. No es necesario reiniciar el servidor para que los cambios surtan efecto y no se requieren privilegios de root para editar esas reglas, lo que simplifica el mantenimiento y permite realizar cambios con una cuenta sin privilegios. Algunos programas populares de código abierto, como WordPress y Joomla, a menudo dependen de un .htaccessarchivo para que el software modifique y cree reglas adicionales a pedido.

    Antes de comenzar a utilizar .htaccessarchivos, deberá configurar y proteger algunas configuraciones más.

    De manera predeterminada, Apache prohíbe el uso de un .htaccessarchivo para aplicar reglas de reescritura, por lo que primero debe permitir cambios en el archivo. Abra el archivo de configuración predeterminado de Apache con nanosu editor de texto favorito.

    1. sudo nano /etc/apache2/sites-available/000-default.conf

    Dentro de ese archivo, encontrará un VirtualHost *:80bloque que comienza en la primera línea. Dentro de ese bloque, agregue el siguiente bloque nuevo para que su archivo de configuración se vea como el siguiente. Asegúrese de que todos los bloques estén correctamente sangrados.

    /etc/apache2/sites-available/000-default.conf

    VirtualHost *:80    Directory /var/www/html        Options Indexes FollowSymLinks        AllowOverride All        Require all granted    /Directory        . . ./VirtualHost

    Guarde y cierre el archivo. Para que estos cambios surtan efecto, reinicie Apache.

    1. sudo systemctl restart apache2

    Ahora, crea un .htaccessarchivo en el directorio web.

    1. sudo nano /var/www/html/.htaccess

    Agregue esta línea en la parte superior del nuevo archivo para activar el motor de reescritura.

    /var/www/html/.htaccess

    RewriteEngine on

    Guarde el archivo y salga.

    Ahora tienes un .htaccessarchivo operativo que puedes usar para controlar las reglas de enrutamiento de tu aplicación web. En el siguiente paso, crearás archivos de sitios web de muestra que usarás para demostrar las reglas de reescritura.

    Paso 3: configuración de reescrituras de URL

    Aquí, configurará una reescritura de URL básica que convierte URL bonitas en rutas reales a páginas. En concreto, permitirá a los usuarios acceder a , pero mostrará una página llamada .http://your_server_ip/aboutabout.html

    Comience creando un archivo con el nombre about.htmlen la raíz web.

    1. sudo nano /var/www/html/about.html

    Copie el siguiente código HTML en el archivo, luego guárdelo y ciérrelo.

    /var/www/html/acercade.html

    html    head        titleAbout Us/title    /head    body        h1About Us/h1    /body/html

    Puede acceder a esta página en , pero tenga en cuenta que si intenta acceder a , verá un error 404 No encontrado . Para acceder a la página usando en su lugar, deberá crear una regla de reescritura.http://your_server_ip/about.htmlhttp://your_server_ip/about/about

    Todos RewriteRulessiguen este formato:

    Estructura general de RewriteRule

    RewriteRule pattern substitution [flags]
    • RewriteRuleespecifica la directiva.
    • patternes una expresión regular que coincide con la cadena deseada de la URL, que es lo que el espectador escribe en el navegador.
    • substitutiones la ruta a la URL real, es decir, la ruta de los servidores de archivos Apache.
    • flagsson parámetros opcionales que pueden modificar el funcionamiento de la regla.

    A continuación, crea tu regla de reescritura de URL. Abre el .htaccessarchivo.

    1. sudo nano /var/www/html/.htaccess

    Después de la primera línea, agregue el resaltado RewriteRuley guarde el archivo.

    /var/www/html/.htaccess

    RewriteEngine onRewriteRule ^about$ about.html [NC]

    En este caso, ^about$es el patrón, about.htmles la sustitución y [NC]es una bandera. Este ejemplo utiliza algunos caracteres con un significado especial:

    • ^indica el inicio de la URL después de your_server_ip/.
    • $Indica el final de la URL.
    • aboutcoincide con la cadena “acerca de”.
    • about.htmles el archivo real al que accede el usuario.
    • [NC]es una bandera que hace que la regla no distinga entre mayúsculas y minúsculas.

    Ahora puedes acceder desde tu navegador. De hecho, con la regla que se muestra arriba, las siguientes URL apuntarán a :http://your_server_ip/aboutabout.html

    • 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 $carácter aparece después de about.
    • http://your_server_ip/contact, porque no coincidirá con la aboutcadena en la regla.

    Ahora tiene un .htaccessarchivo operativo con una regla básica que puede modificar y ampliar según sus necesidades. En las siguientes secciones, analizaremos dos ejemplos adicionales de directivas de uso común.

    Ejemplo 1: simplificación de 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 utilizar una URL como http://example.com/results.php?item=shirtseason=summer. En este ejemplo, se pasan dos parámetros adicionales al result.phpscript de aplicación imaginario: item, con el valor shirt, y seasoncon el valor summer. La aplicación puede utilizar la información de la cadena de consulta para crear la página correcta para el visitante.

    Las reglas de reescritura de Apache se emplean a menudo para simplificar enlaces largos y desagradables como los anteriores y convertirlos en URL fáciles de escribir e interpretar visualmente. En este ejemplo, simplificará el enlace anterior para que se convierta en http://example.com/shirt/summer. Los valores de los parámetros shirty summersiguen estando en la dirección, pero sin la cadena de consulta ni el nombre del script.

    Aquí hay una regla para implementar esto:

    Sustitución simple

    RewriteRule ^shirt/summer$ results.php?item=shirtseason=summer [QSA]

    Se shirt/summercoincide explícitamente con la dirección solicitada y se le indica a Apache que la sirva results.php?item=shirtseason=summeren su lugar.

    Las [QSA]banderas se usan comúnmente en reglas de reescritura. Le indican a Apache que agregue cualquier cadena de consulta adicional a la URL proporcionada, de modo que si el visitante escribe, el servidor responderá con . Sin esto, la cadena de consulta adicional se descartaría.http://example.com/shirt/summer?page=2results.php?item=shirtseason=summerpage=2

    Si bien 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 ningún otro artículo, como pants, o temporada, como winter.

    Para que la regla sea más genérica, puede utilizar expresiones regulares para hacer coincidir partes de la dirección original y utilizar esas partes en un patrón de sustitución. La regla modificada tendrá el siguiente aspecto:

    Sustitución simple

    RewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1season=$2 [QSA]

    El primer grupo de expresiones regulares entre paréntesis coincide con una cadena que contiene caracteres alfanuméricos y números como shirto pantsy guarda el fragmento coincidente como $1variable. El segundo grupo de expresiones regulares entre paréntesis coincide exactamente con summer, winter, fall, o springy, de manera similar, guarda el fragmento coincidente como $2.

    Luego, los fragmentos coincidentes se utilizan en la URL resultante en las variables itemy seasonen lugar de los valores shirty codificados summerque utilizó antes.

    Lo anterior se convertirá, por ejemplo, http://example.com/pants/summeren http://example.com/results.php?item=pantsseason=summer. Este ejemplo también es a prueba de futuro, ya que permite reescribir correctamente varios elementos y temporadas utilizando una sola regla.

    Ejemplo 2: Cómo agregar condiciones con lógica usando RewriteConds

    Las reglas de reescritura no siempre se evalúan necesariamente una por una sin limitaciones. La RewriteConddirectiva nos permite agregar condiciones a las reglas de reescritura para controlar cuándo se procesan. Todas RewriteCondscumplen con el siguiente formato:

    Estructura general de RewriteCond

    RewriteCond TestString Condition [Flags]
    • RewriteCondespecifica la RewriteConddirectiva.
    • TestStringes la cadena contra la cual se realizará la prueba.
    • Conditiones el patrón o condición a coincidir.
    • Flagsson parámetros opcionales que pueden modificar la condición y las reglas de evaluación.

    Si a RewriteCondse evalúa como verdadero, RewriteRulese considerará lo inmediatamente siguiente. Si no, se descartará la regla. RewriteCondSe pueden usar varios uno después del otro y, con el comportamiento predeterminado, todos deben evaluarse como verdaderos para que se considere la siguiente regla.

    A modo de 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 estándar 404 Not Found . Esto se puede lograr con las siguientes reglas de condiciones:

    Redirigir todas las solicitudes a archivos y directorios inexistentes a la página de inicio

    RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule . / [R=301]

    Con lo anterior:

    • %{REQUEST_FILENAME}es la cadena que se debe verificar. En este caso, es el nombre del archivo solicitado, que es una variable del sistema disponible para cada solicitud.
    • -fes una condición incorporada que verifica si el nombre solicitado existe en el disco y es un archivo. Es !un operador de negación. En combinación, !-fse evalúa como verdadero solo si un nombre especificado no existe o no es un archivo.
    • De manera similar, !-dse evalúa como verdadero solo si un nombre especificado no existe o no es un directorio.

    El punto RewriteRulede la última línea solo tendrá efecto en las solicitudes a archivos o directorios inexistentes. El patrón en RewriteRulesí es muy simple. El punto .en el patrón coincide con cualquier cosa y la sustitución dirige cada solicitud a la /raíz del sitio web.

    Además, [R=301]la bandera le dice a Apache que devuelva un código de respuesta HTTP de redirección 301 Moved Permanently al navegador, lo que da como resultado que el navegador sepa que se produjo la redirección y obtenga explícitamente la raíz del sitio web en lugar de la URL solicitada, y el cambio se refleja en la barra de direcciones del navegador.

    Sin esta bandera, Apache devolvería el contenido raíz del sitio web, pero el navegador aún pensaría que la URL de la página solicitada existe y mostraría la dirección solicitada originalmente en la barra de direcciones.

    Conclusión

    mod_rewritele permite crear URL legibles para humanos. En este tutorial, utilizó la RewriteRuledirectiva para redirigir URL, incluidas aquellas con cadenas de consulta. También escribió URL de redirección condicional utilizando la RewriteConddirectiva.

    Si desea obtener más información sobre mod_rewrite, eche un vistazo a la Introducción a mod_rewrite de Apache y la documentación oficial de Apache para mod_rewrite .

    SUSCRÍBETE A NUESTRO BOLETÍN 
    No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir

    Este sitio web utiliza cookies para mejorar tu experiencia mientras navegas por él. Este sitio web utiliza cookies para mejorar tu experiencia de usuario. Al continuar navegando, aceptas su uso. Mas informacion