Apuntes redes

No vayas a access.log, donde habitan los monstruos.

¿Qué es .htaccess?

El archivo .htaccess (hypertext access) es un archivo de configuración usado por los servidores Apache, que permite regular algunos comportamientos de un sitio web, sin tener que tocar los archivos de configuración del servidor, ajustando cosas como redirecciones, seguridad, URLs amigables o rendimiento.

Nota: El punto al inicio (.htaccess) indica que es un archivo oculto. Asegúrate de que tu editor o cliente FTP muestre archivos ocultos para verlo.

¿Para qué sirve .htaccess?

Con .htaccess, puedes hacer muchas cosas útiles para tu sitio web.

  • Redirecciones: Por ejemplo, redirigir todo el tráfico de HTTP a HTTPS para que tu sitio sea seguro.
  • URLs amigables: Convertir URLs largas y feas en cortas y legibles (como misitio.com/producto/123 en lugar de misitio.com/index.php?id=123).
  • Seguridad: Bloquear el acceso a carpetas sensibles o proteger archivos.
  • Optimización: Habilitar compresión de archivos o caché para que tu sitio cargue más rápido.
  • Errores personalizados: Mostrar páginas de error (como 404) con tu propio diseño.

Ejemplos prácticos de .htaccess

A continuación, algunos ejemplos de uso común. Importante: Antes de editar tu .htaccess, haz una copia de seguridad por si algo sale mal (aunque la mayoria de las meteduras de pata se solucionan simplemente borrando la instrucción incorrecta).

También asegúrate de que tu servidor Apache tenga habilitado el módulo mod_rewrite para las reglas de reescritura.

1. Redirigir de HTTP a HTTPS

Forzar que tu sitio use HTTPS (conexión segura):

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Explicación: Si alguien accede a http://misitio.com, será redirigido a https://misitio.com.
El R=301 indica una redirección permanente, buena para SEO.

2. Crear URLs amigables

Si tienes un sitio con URLs como misitio.com/index.php?page=contacto, puedes hacer que se vean como misitio.com/contacto.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !‐f
RewriteCond %{REQUEST_FILENAME} !‐d
RewriteRule ^(.*)$ index.php?page=$1 [L]

Explicación: Esta regla redirige cualquier URL (que no sea un archivo o carpeta real) a index.php, pasando el nombre de la página como parámetro. Por ejemplo, misitio.com/contacto se convierte en misitio.com/index.php?page=contacto internamente.

3. Proteger una carpeta con contraseña

Si tienes una carpeta como /admin, puedes protegerla para que solo accedan usuarios con contraseña.

<Directory /ruta/a/tu/carpeta/admin>
    AuthType Basic
    AuthName "Acceso Restringido"
    AuthUserFile /ruta/a/.htpasswd
    Require valid-user
</Directory>

Nota: Necesitas crear un archivo .htpasswd con las credenciales (puedes generarlo con herramientas online o comandos como htpasswd). Consulta con tu hosting cómo configurar esto, ya que la ruta al .htpasswd puede variar.

4. Habilitar compresión para mejorar la velocidad

Comprimir archivos como CSS, JS o HTML reduce el tiempo de carga.


<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE text/css
    AddOutputFilterByType DEFLATE application/javascript
    AddOutputFilterByType DEFLATE text/xml
    AddOutputFilterByType DEFLATE application/xml
    AddOutputFilterByType DEFLATE application/xhtml+xml
    AddOutputFilterByType DEFLATE application/rss+xml
</IfModule>

explicación: Esto activa la compresión DEFLATE (que usa el algoritmo GZIP internamente) para archivos de texto, CSS y JavaScript. No comprime imágenes (como JPG o PNG) porque ya están comprimidas.

¿Cuánto mejora el rendimiento? La compresión DEFLATE puede reducir el tamaño de archivos de texto entre un 50% y 80%, lo que hace que las páginas carguen más rápido, a veces hasta un 15-30% menos de tiempo en sitios pequeños. Por ejemplo, un archivo CSS grande puede reducirse hasta un 83%, según pruebas reales. Sin embargo, comprimir archivos usa algo de CPU, así que en sitios con mucho tráfico dinámico (como una tienda online grande), el servidor podría trabajar más. Para sitios pequeños o personales, el impacto en CPU es mínimo y el beneficio en velocidad es notable.

5. Página de error 404 personalizada

Puedes mostrar una página personalizada cuando alguien intenta acceder a una URL que no existe.

ErrorDocument 404 /error-404.html

Explicación: Si alguien va a misitio.com/pagina-inexistente, será redirigido a misitio.com/error-404.html. Acuérdate de crear un archivo error-404.html !

Entendiendo las reglas de redirección

Las reglas de redirección en .htaccess usan el módulo mod_rewrite de Apache para manipular URLs.
Estas reglas usan expresiones regulares (regex) y banderas (como [L] o [R=301]), que son instrucciones adicionales. Las expresiones regulares están basadas en el standard PCRE (perl) con alguna particularidad.

¿Qué son las expresiones regulares?

Las expresiones regulares son patrones que indican a mod_rewrite cómo debe verse una URL. Por ejemplo, ^(.*)$ significa "cualquier parte de una URL salvo el dominio".
Si ya conoces algún lenguaje de programación (JavaScript. PHP o Python), te será familiar.

¿Qué son las banderas?

Las banderas son códigos entre corchetes (como [L, R=301]) que le dicen a Apache cómo aplicar la regla. Las más comunes son:

  • L (Last): Detiene el procesamiento de más reglas, si se cumple la actual.
  • R=301 o R=302: Indica una redirección permanente (301) o temporal (302).
  • NC (No Case): Ignora mayúsculas/minúsculas (por ejemplo, Contacto y contacto son lo mismo).
  • QSA (Query String Append): Conserva parámetros de la URL original (como ?id=123).
  • NE (No Escape): Evita codificar caracteres especiales (como #).

Desglose del ejemplo de redirección de HTTP a HTTPS

En el ejemplo anterior de redirección de http a https, la línea htaccess se interpreta como sigue:

  • RewriteEngine On: Activa el motor de reescritura (mod_rewrite).
  • RewriteCond %{HTTPS} off: Comprueba si la conexión no es segura (HTTP en lugar de HTTPS).
  • RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]: Redirige a la misma URL pero con HTTPS, usando las variables de Apache para el dominio y la ruta.
  • ^(.*)$: Captura toda la URL (cualquier carácter desde el inicio hasta el final).
  • https://%{HTTP_HOST}%{REQUEST_URI}: Redirige a la misma URL, pero con https://.
  • %1 no se usa aquí porque no hay grupos en la condición, pero %{HTTP_HOST} (dominio, como misitio.com) y %{REQUEST_URI} (ruta, como pagina) son variables de Apache.
  • [L,R=301]: Aplica una redirección permanente (R=301) y detiene el procesamiento de más reglas (L).

En resumen, esta regla redirige cualquier solicitud HTTP a su equivalente HTTPS, manteniendo la misma ruta y dominio.

Desglose del ejemplo de URLs amigables

En el ejemplo para crear urls amigables:

  1. RewriteEngine On Activa el motor de reescritura.
  2. RewriteCond %{REQUEST_FILENAME} !-f Esta condición verifica que el archivo solicitado (REQUESTFILENAME) _no existe físicamente (!-f significa "no es un archivo"). Si el archivo sí existe, la regla de reescritura se omite.
  3. RewriteCond %{REQUEST_FILENAME} !-d Como el anterior, comprueba si no es un directorio (!-d). De nuevo, si es un directorio, se omite.
  4. RewriteRule ^(.*)$ index.php?page=$1 [L] Si se cumplen las dos condiciones anteriores, cualquier petición que llegue (por ejemplo, misitio.com/ayuda) será capturada ($1) y redirigida a index.php?page=ayuda. El patrón ^(.*)$ captura la parte de la URL después del dominio, no el dominio en sí, y la pasa como valor del parámetro page. La bandera [L] significa "last": indica que esta es la última regla que se debe aplicar si coincide.

Consejos para trabajar con .htaccess

  • Haz copias de seguridad: Un error en .htaccess puede hacer que tu sitio deje de funcionar (error 500). Siempre guarda una copia antes de editar.
  • Prueba con cuidado: Usa un editor de texto plano para crear o modificar el archivo. Asegúrate de que el archivo tenga el nombre exacto .htaccess y permisos correctos (generalmente 644). Después de hacer cambios, verifica que tu sitio siga funcionando. Si algo falla, revisa los logs de error de Apache (puedes pedirlos a tu hosting).
  • Compatibilidad: No todos los hostings permiten todas las reglas de .htaccess. Consulta con tu proveedor si necesitas activar módulos como mod_rewrite.
  • Aprende más: .htaccess es un archivo pequeño y muy poderoso, pero una instrucciones en un formato arcano, por no decir arcaico. Online encontrarás mas información y seguramente soluciones para tu problema concreto.

Conclusión

Con las reglas adecuadas, puedes mejorar la seguridad, la velocidad y la experiencia de usuario de tu sitio. Sin embargo dominar todas sus posibilidades requiere su estudio.

TOP