Recientemente he publicado una entrada sobre qué hacer después de instalar Drupal. En ella hablo de que una de las primeras cosas debería ser configurar correctamente el fichero .htaccess. Aprovecho ahora para Logo de Apachehablar con más detenimiento de ese fichero, que es fundamental dentro de cualquier servidor web, independientemente del software que lo mueva.

El fichero hypertext access, más conocido como .htaccess, es uno de los más importantes dentro de cualquier servidor web. A pesar de que fue diseñado específicamente para funcionar con servidores Apache, con el paso del tiempo su uso se ha generalizado en el resto de servidores web.

En la mayoría de hosting que contratamos es imposible que nos den acceso al fichero del servidor, el famoso httpd.conf. Pero casi todas las acciones que se realizan con él se pueden llevar a cabo con .htaccess de manera muy eficaz, ya que permite definir directivas de configuración para cada directorio, y de los subdirectorios que de ahí cuelguen.

El hecho de que se pueda contar con un fichero .htaccess en cada directorio del servidor tiene un efecto positivo: permitir controlar mejor el acceso y las directivas a aplicar dentro del contenido de dichos directorio. Pero también tiene un efecto negativo que debemos considerar: afecta a la velocidad del sitio. Cada vez que el cliente lanza una petición, lo primero que hace el servidor es verificar la existencia de este fichero, para aplicar o no sus directrices, lo que afecta directamente al rendimiento del sitio.

Para que estos ficheros sean tenidos en cuenta por el servidor es necesario que la directiva AllowOverride esté activada en el fichero httpd.conf.

A continuación hablaremos de tres elementos claves relacionados con este fichero:

 

Usos concretos del fichero .htaccess

Las posibilidades de configuración que ofrece este fichero son inmensas. Trataré de comentar las más importantes:

  • Autorización y control de acceso. El uso más común se centra en emplear el fichero para especificar restricciones de acceso a un directorio (o varios) en concreto. Si no se posee la contraseña no se permitirá el acceso a la información que está almacenada en dicho directorio. El único inconveniente que tiene realizar el control de acceso por este método (también se podría hacer a nivel de hosting o por medio del CMS) reside en que debe existir otro fichero, denominado .htpasswd, que almacene los nombres de usuario y las contraseñas. Esto limita en cierta medida la gestión de contraseñas (no se podría “recordar contraseña”, ni podría ser cambiada por el usuario, sólo por el administrador) y tiene algún que otro problema relacionado con la seguridad. En la web del servidor de Apache explican cómo se debe realizar.

Mensaje de control de acceso

  • Crear URLs amigables. Aunque no está demostrado que contar con un URLs amigables suponga un beneficio directo a nivel SEO, es evidente que influye en la relación entre lo que escribes y el usuario. Siempre le resultará más sencilla, comprensible y lógica una URL amigable que otra llega de números y letras. Para que esto funcione es necesario que el módulo mod_rewrite de Apache esté activado. Con estas líneas en el fichero .htacces debería ser suficiente para que la cosa funcione:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
</IfModule>
  • Limitar el acceso por IP. Existen otras opciones de restringir el acceso al sitio, a un directorio o a un fichero empleando la IP del cliente que hace la petición. Este tipo de operaciones vienen muy bien cuando se están recibiendo muchos ataques de un mismo sitio, o cuando se quiere limitar el acceso a determinado contenido a un rango de IPs determinado. La orden:
<LIMIT GET>
order deny,allow
deny from 1.1.1.1
allow from all
</LIMIT>

impide que pueda acceder la máquina con la IP 1.1.1.1 y permite el acceso a todas las demás. La orden:

<Files index.php>
Order Deny,Allow
Deny from All
Allow from 1.2.3.4
</Files>

Impide que la máquina con el IP 1.2.3.4 pueda acceder al fichero index.php

  • Control de la caché. Se emplea para gestionar la caché web del navegador y/o proxie, reduciendo el consumo de ancho de banda. Se usa también para agilizar la comunicación con el servidor y descargarlo de trabajo. Aunque este proceso también se puede gestionar desde el CMS, en ocasiones es maś efectivo hacerlo desde el htaccess. Por ejemplo, de esta manera se establecería una semana como periodo de vigencia de las imágenes almacenadas en la caché:
<FilesMatch "\.(jpg|jpeg|png|gif|swf)$">
Header set Cache-Control "max-age=604800, public"
</FilesMatch>
  • Obligar a usar una conexión segura. Es muy útil si se tiene instalado un certificado SSL. De esta manera se obliga a todo el sitio a que se emplee este certificado. Los agentes de búsqueda, por ejemplo, se redirigirán hacia ahí. Se hace por medio de:
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
  • Control de los tipos MIME. Se emplea para controlar cómo queremos que el servidor gestione los diferentes tipos de formatos MIME. De esta manera, por ejemplo, se puede evitar la descarga de ficheros para filtros y estilo del gestor bibliográfico Endnote:
AddType application/x-endnote-style ens
AddType application/x-endnote-filter enf
  • Indicar la página por defecto. Aunque suele venir configurada en Apache, puede suceder que nos interese cambiar la página principal por defecto. Para ello:
DirectoryIndex welcome.html
  • Página de error 404. El famoso error de que un archivo ya no existe. Es uno de los mayores generadores de penalizaciones SEO. Es posible configurar htaccess para que el sistema muestre una página propia, en vez del típico error: 404 URL not found.
ErrorDocument 404 /error404.html

Si se desea, se pueden personalizar el resto de páginas de error con 403/error403.html; 401/error401.html…

Página 404 personalizada

  • Página de redirección 301. Se trata de redirigir de una página a otra. Se hace así:
Redirect 301 /index.html /nuevo/index.html

Piensa que no es lo mismo la redirección 301 (permanente) que la 302 (temporal). En este blog se explica muy bien la diferencia.

  • Redirigir a otro dominio. Muy útil cuando estás migrando el contenido de un servidor a otro y quieres mantener activos ambos para no sufrir penalizaciones SEO. Para ello:
RewriteEngine onRewriteCond %{HTTP_HOST} ^www.web-antigua..com$ [OR]
RewriteCond %{HTTP_HOST} ^web-antigua.com$
RewriteRule ^/?$ "http://nueva-web.com/" [R=301,L]
  • URLS canónicas. El hecho de que una misma web sea accesible por medio de http://www y por http:// (sin el www) la convierte en dos webs diferentes desde el punto de vista SEO. Teniendo en cuenta que los buscadores suelen penalizar la copia de material, esto implicaría que se considera que una web plagia a la otra. Si tenemos el dominio www.hola.com y queremos captar tanto a los usuarios que se dirijan a www.hola.com como a los de hola.com, deberíamos escribir esto:
RewriteEngine onRewriteCond %{HTTP_HOST} ^www.hola.com$
RewriteRule ^/?$ "http://hola.com/" [R=301,L]

Efectivamente, se trata de una pequeña variación de la redirección 301 explicada anteriormente.

  • Evitar el listado de ficheros. De esa manera impedimos que alguien pueda acceder al nombre de todos los ficheros que existan dentro de una carpeta determinada. Es un mecanismo de seguridad muy necesario.
Options -IndexesIndexIgnore *
  • Limitar el tamaño máximo de los ficheros. Para evitar que se puedan subir al servidor ficheros muy grandes y se consuma de esa manera el ancho de banda contratado. Es, junto al control de hotlink, el mejor sistema para gestionar el tráfico, ya que también permite definir el tiempo máximo que permitimos que espere el servidor para la ejecución de cualquier proceso:
php_value upload_max_filesize 10M
php_value max_execution_time 200
php_value max_input_time 200

 

 

Cómo crear el fichero .htaccess

El fichero .htaccess no es especial en cuanto a su forma de creación. No se trata más que de un fichero de texto en modo ASCII que, simplemente, no tiene nombre. Al menos tal y como estamos acostumbrados a ver: nombre.extensión

El hecho de que tenga un punto delante indica que se trata de un fichero invisible, que no será visualizado si se genera un listado de ficheros de una carpeta concreta.

Para crearlo bastará con un editor de textos (notepad, gedit…) y guardarlo como htaccess.txtNotepad Una vez hecho esto se puede subir al servidor vía FTP y allí se renombra a .htaccess También existe la posibilidad de crearlo directamente desde el panel del hosting.

Si lo prefieres, también puedes emplear cualquier plantilla de las muchas que hay en la Web para crearlo. No tendrás más seleccionar del formulario las opciones que quieres configurar, darle a aplicar y listo. Entre las plantillas que más me gustan:

Y aquí tienes un generador de ficheros htpasswd.

Cómo proteger el fichero .htaccess

Proteger htaccessCreo que ya ha quedado suficientemente clara la potencia e importancia de este fichero. Por eso es fundamental protegerlo bien. Para ello puedes hacer varias cosas:

  • Evitar el acceso externo a .htaccess. Dentro del mismo fichero debes escribir:# protege el archivo htaccess
<files .htaccess>
order allow,
denydeny from all
</files>

No vendría mal que extendieras esta protección al fichero htpasswd

  • Desde el cliente FTP asigna los privilegios 644 o RW-R—R– para evitar que se pueda editar desde fuera del servidor.

 

Consejos de uso

  • Aunque ya lo he mencionado al principio, no abuses de estos ficheros. Si creas un fichero de estos en cada directorio tendrás un servidor muy seguro, sí, pero también muy lento.
  • Organiza la información dentro del .htaccess para que sea fácil de gestionar. Si vas poniendo líneas a lo loco lo más normal es que, pasado un tiempo, no sepas ni lo que has escrito.
  • Acostúmbrate a comentar (con #) todas las líneas que pongas o, al menos, los grupos de directrices. Te será más sencillo entender lo que has escrito dentro de varios meses.
  • La orden de un directorio afecta a todos los subdirectorios que estén por debajo de él. Ten cuidado con lo que haces.