Algunos comandos para exprimir el .htaccess

Aunque ya hemos hablado en alguna ocasión del fichero .htaccess, profundizamos un poco más en su configuración, que nos permite descentralizar la gestión del servidor web. Se implementa en el directorio raíz y, con sólo unas fáciles instrucciones, podremos modificar multitud de parámetros de configuración con funcionalidades tan interesantes como el control de acceso, impedir el hot-linking, proteger directorios, mejorar el rendimiento del site, entre otras. En este artículo, explicamos los principales trucos para sacar el máximo partido a todo lo que nos permite el .htaccess.

Control de acceso al sitio

Si por alguna razón queremos denegar el acceso a nuestro sitio a todos los usuarios o permitirlo tan solo a unas cuantas direcciones IP, podríamos hacer lo siguiente:

  • Impedir acceso a un sitio web. Deniega a todos los usuarios que intenten acceder a nuestro sitio:
     Deny from All
  • Impedir acceso, con restricciones. Deniega el acceso a todos menos a una IP concreta:
     Order deny, allow
     Deny from All
     Allow from 192.xxx.xxx.xxx
  • Permitir acceso menos a… Permite el acceso a todos menos a ciertas IPs:
     Order deny, allow
     Allow from All
     Deny from xxx.xxx.xxx.xxx
     Deny from xxx.xxx.xxx.yyy

Impedir que otros sitios enlacen a tus imágenes (hotlinking)

Para evitar el hotlinking, que se basa en enlazar de forma directa ficheros, como imágenes y vídeos, pertenecientes a otras Webs y que hace que tengamos un mayor consumo de ancho de banda, utilizaremos la siguiente configuración en el .htcaccess:

RewriteEngine on
  RewriteCond %{HTTP_REFERER} !^$
  RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?ejemplo.com [NC]
  RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]

Proteger un directorio con contraseña

Primero debes crear un archivo llamado .htpasswd con el comando htpasswd. Este archivo se debe guardar en cualquier directorio que no sea directamente accesible mediante el servidor web:

$ htpasswd -c /home/usuario/.htpasswd nombre_usuario

Y ahora ya puedes usar este archivo para proteger con contraseña el acceso a cualquier directorio:

AuthType Basic
 AuthName "Zona Segura"
 AuthUserFile /home/usuario/.htpasswd
 Require valid-user

Mejorar el rendimiento

  • Compresión. Podemos comprimir archivos Gzip o DEFLATE y, con esto, ganaremos un menor peso en nuestros estilos, javascripts, imágenes y código en general, con lo que obtendremos una mayor velocidad de carga en nuestra página.
    Si nuestro servidor no soporta GZIP, utilizaremos DEFLATE:

    <IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/plain
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE text/xml
    AddOutputFilterByType DEFLATE text/css
    AddOutputFilterByType DEFLATE text/javascript
    AddOutputFilterByType DEFLATE application/xml
    AddOutputFilterByType DEFLATE application/xhtml+xml
    AddOutputFilterByType DEFLATE application/rss+xml
    AddOutputFilterByType DEFLATE application/atom_xml
    AddOutputFilterByType DEFLATE application/javascript
    AddOutputFilterByType DEFLATE application/x-javascript
    AddOutputFilterByType DEFLATE application/x-shockwave-flash
    </IfModule>

    Si nuestro servidor no soporta DEFLATE, utilizaremos GZIP:

    <IfModule mod_gzip.c>
    mod_gzip_on Yes
    mod_gzip_item_include file \.html$
    mod_gzip_item_include file \.php$
    mod_gzip_item_include file \.css$
    mod_gzip_item_include file \.js$
    mod_gzip_item_include mime ^application/javascript$
    mod_gzip_item_include mime ^application/x-javascript$
    mod_gzip_item_include mime ^text/.*
    mod_gzip_item_include handler ^application/x-httpd-php
    mod_gzip_item_exclude mime ^image/.*
    </IfModule>
  • Utilizar la cabecera Expires de HTTP. Con este ejemplo no haremos que cargue nuestro sitio más rápido pero sí cuando un usuario vuelva a visitar nuestra página web.
     FileETag MTime Size
     ExpiresActive on
     ExpiresDefault "access plus 86400 seconds"
  • Desactivar la cabecera ETag de HTTP. Las ETags son etiquetas que nos sirven para comparar la caché del navegador con la del servidor. Si coincide, los archivos se recogen de la caché del navegador, y si no, del servidor. Con esto, nos ahorramos ancho de banda e incrementamos la velocidad de nuestra página, pero en ocasiones, las ETags se definen con atributos únicos para cada servidor y no coinciden con las del servidor, teniendo que descargarse aunque lo tengamos en la caché del navegador:
    Header unset ETag
    FileETag None
  • Definir opciones de configuración de PHP.  Podemos indicar también desde el .htcaccess diferentes opciones de configuración, donde podrás tocar parámetros como el máximo tamaño de fichero que puedes subir al servidor (php_value upload_max_filesize), el tiempo máximo en segundos que se permite a un script para procesar datos que reciba de entrada (php_value max_execution_time) o determinar si los errores deben ser impresos en pantalla como parte de la salida o si deberían ocultarse al usuario (display_errors).
    php_value upload_max_filesize
    php_value max_execution_time
    allow_url_fopen
    always_populate_raw_post_data
    auto_globals_jit
    display_errors
    error_reporting
    file_uploads
    max_input_vars
    memory_limit
    post_max_size
    short_open_tag
    upload_max_filesize

Páginas de error personalizadas

Podemos personalizar con .htcaccess las páginas de error que se muestran al usuario y que se corresponden con un código establecido:

  • El usuario que intenta acceder a ese enlace ha puesto mal la sintaxis:
    ErrorDocument 400 /errores/error400.html
  • Falla la autenticación (usuario y contraseña):
    ErrorDocument 401 /errores/error401.html
  • El usuario no tiene permisos para acceder a un fichero:
    ErrorDocument 403 /errores/error403.html
  • Es el error que se muestra cuando el servidor no encuentra la url a la que el usuario está intentando acceder:
    ErrorDocument 404 /errores/error404.html
  • El servidor no sabe qué tipo de error es. Normalmente es porque éste está mal configurado:
    ErrorDocument 500 /errores/error500.html

Forzar el empleo de la codificación UTF-8

  • Podemos forzar la codificación UTF-8 para contenidos de tipo text/plain o text/html:
    AddDefaultCharset utf-8
  • O si queremos que afecte a varios tipos de archivo:
    AddCharset utf-8 .atom .css .js .json .rss .vtt .xml

Forzar al navegador a descargar el archivo (y no mostrarlo)

Cambiando en la siguiente configuración la extensión del archivo, forzamos al navegador a descargarlo. En el siguiente ejemplo hace que todos los archivos con extensión .psd (Photoshop), se descarguen una vez hacemos clic:

<Files *.psd>
 ForceType application/octet-stream
 Header set Content-Disposition attachment
</Files>

Forzar el uso de SSL

Con el ejemplo que os dejamos a continuación fuerza a que se utilice SSL y no permite conexiones http. Para evitar escuchas en http:// utilizamos por debajo la directiva ErrorDocument.

SSLOptions + StrictRequire
 SSLRequireSSL

Crear URLs amigables

. htaccess con una llamada al módulo de Apache mod_rewrite permite configurar las direcciones URL como quieras. Aunque estuvimos hablando de este tema en Cómo conseguir URL amigables con la modificación del archivo .htaccess, a continuación mostramos algunos ejemplos de cómo formarlas:

RewriteEngine on
 RewriteRule ^acercade/$ /paginas/acercade.html [L]
 RewriteRule ^caracteristicas/$ /caracteristicas.php [L]
 RewriteRule ^comprar/$ /comprar.html [L]
 RewriteRule ^contacto/$ /paginas/contacto.htm [L]
Compartir

Share on FacebookTweet about this on TwitterShare on LinkedInEmail this to someoneShare on Google+
2 comentarios
  1. Pascual Martínez Dice:

    Hola

    He instalado estas directrices en htaccess, pero en Gtmetrix y Page speed, siguen dándome que no está bien del todo

    Hay algún plugin que pueda realizar este trabajo de forma correcta, tanto en wordpress como en joomla

    Gracias

    Responder

Dejar un comentario

¿Quieres unirte a la conversación?
Siéntete libre de contribuir

Deja un comentario

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