En esta ocasión vamos a ver algunos trucos y útiles ejemplos sobre como configurar el archvo .htaccess en un servidor Apache.

Redirección y reescritura de URL

Para que funcionen correctamente los ejemplos de configuración mostrados en este post, debes tener el módulo mod_rewrite instalado y activado en el servidor.

Que todas las URL empiecen por www

Esta configuración funciona solamente para las URL no seguras que empiezan por (http://):

RewriteEngine on
RewriteCond %{HTTP_HOST} ^tuweb\.com [NC]
RewriteRule ^(.*)$ http://www.tuweb.com/$1 [L,R=301,NC]
</div>

Esta configuración funciona tanto para las URL normales (http://) como para las URL seguras (https://):

RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Que ninguna URL empiece por www

Esta configuración funciona solamente para las URL no seguras que empiezan por (http://):

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.ejemplo\.com [NC]
RewriteRule ^(.*)$ http://ejemplo.com/$1 [L,R=301]

 

Que todas las URL sean seguras y empiecen por https

RewriteEngine on
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Que todas las URL acaben con la barra /

RewriteCond %{REQUEST_URI} /+[^\.]+$
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]

 

Redirigir todo un sitio web

Esta configuración redirige todas las páginas al nuevo sitio, no solo el index.

Redirect 301 / http://nuevo_sitio.com/

 

Redirigir páginas individuales

Redirect 301 /pagina_antigua.html http://www.ejemplo.com/nueva_pagina.html
Redirect 301 /pagina_antigua_2.html http://www.ejemplo.com/directorio/

Mejorar el rendimiento

Comprimir archivos

<IfModule mod_deflate.c>
 
    # Forzar compresión también para las cabeceras mal escritas
    <IfModule mod_setenvif.c>
        <IfModule mod_headers.c>
            SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
            RequestHeader append Accept-Encoding «gzip,deflate» env=HAVE_Accept-Encoding
        </IfModule>
    </IfModule>
 
    # Comprimir cualquiera de estos tipos de contenidos
    <IfModule mod_filter.c>
        AddOutputFilterByType DEFLATE application/atom+xml \
                                      application/javascript \
                                      application/json \
                                      application/rss+xml \
                                      application/vnd.ms-fontobject \
                                      application/x-font-ttf \
                                      application/x-web-app-manifest+json \
                                      application/xhtml+xml \
                                      application/xml \
                                      font/opentype \
                                      image/svg+xml \
                                      image/x-icon \
                                      text/css \
                                      text/html \
                                      text/plain \
                                      text/x-component \
                                      text/xml
    </IfModule>
 
</IfModule>

Utilizar la cabecera Expires de HTTP

La cabecera Expires de HTTP indica al navegador la fecha a partir de la cual un recurso se considera «no válido» y que no se use lo guardado en la caché, por lo que vuelve a solicitarse al servidor.

La recomendación para muchos de los archivos estáticos (CSS, JavaScript, imágenes, etc.) consiste en establecer una fecha de expiración muy lejana (1 año por ejemplo). No obstante, si los nombres de los archivos no incluyen información sobre su versión, entonces es mejor que la expiración no sea tan lejana (1 semana por ejemplo).

Utiliza la siguiente configuración para indicar la fecha de expiración de todos los archivos estáticos habituales de las aplicaciones web:

<IfModule mod_expires.c>
    ExpiresActive on
    ExpiresDefault «access plus 1 month»
    
  # Favicon
    ExpiresByType image/x-icon «access plus 1 year»  
 
  # CSS
    ExpiresByType text/css  «access plus 1 year»
 
  # Fuentes web
    ExpiresByType application/font-woff «access plus 1 month»
    ExpiresByType application/vnd.ms-fontobject «access plus 1 month»
    ExpiresByType application/x-font-ttf «access plus 1 month»
    ExpiresByType font/opentype «access plus 1 month»
    ExpiresByType image/svg+xml «access plus 1 month»
 
  # Archivos AJAX y Web Sockets
    ExpiresByType application/json «access plus 0 seconds»
    ExpiresByType application/xml «access plus 0 seconds»
    ExpiresByType text/xml «access plus 0 seconds»
 
  # Componentes HTML (HTCs)
    ExpiresByType text/x-component «access plus 1 month»
 
  # HTML
    ExpiresByType text/html «access plus 0 seconds»
 
  # JavaScript
    ExpiresByType application/javascript «access plus 1 year»
 
  # Manifest
    ExpiresByType application/x-web-app-manifest+json «access plus 0 seconds»
    ExpiresByType text/cache-manifest «access plus 0 seconds»
 
  # Fotos, vídeos y audio
    ExpiresByType audio/ogg «access plus 1 month»
    ExpiresByType image/gif «access plus 1 month»
    ExpiresByType image/jpeg «access plus 1 month»
    ExpiresByType image/png «access plus 1 month»
    ExpiresByType video/mp4 «access plus 1 month»
    ExpiresByType video/ogg «access plus 1 month»
    ExpiresByType video/webm «access plus 1 month»
 
  # Canales RSS y Atom
    ExpiresByType application/atom+xml «access plus 1 hour»
    ExpiresByType application/rss+xml «access plus 1 hour»
   
</IfModule>

 

Seguridad

Impedir cualquier acceso a un sitio web

La siguiente configuración impide, sin excepción, todas las conexiones a tu sitio web, por lo que es una forma rápida de hacerlo desaparecer de Internet:

Deny from All
# Para servidores Apache 2.4, utiliza lo siguiente:
# Require all denied

Impedir cualquier acceso no autorizado

Sustituye xxx.xxx.xxx.xxx por la dirección IP que quieres que tenga acceso al sitio. Esta configuración también soporta la definición de rangos de direcciones IP.

Order deny, allow
Deny from All
Allow from xxx.xxx.xxx.xxx
 
# Para servidores Apache 2.4, utiliza lo siguiente
# Require ip xxx.xxx.xxx.xxx

 

Bloquear el acceso a determinadas IP´s

La siguiente configuración es la contraria de la configuración mostrada anteriormente, ya que permite el acceso desde cualquier dirección IP salvo las indicadas:

Order deny, allow
Allow from All
Deny from xxx.xxx.xxx.xxx
Deny from xxx.xxx.xxx.yyy
 
# Para servidores Apache 2.4, utiliza lo siguiente
# Require not ip xxx.xxx.xxx.xxx
# Require not ip xxx.xxx.xxx.yyy

 

Impedir el acceso a los archivos y directorios ocultos

Los archivos y directorios ocultos son aquellos cuyo nombre empieza con un punto. Entre otros, esta configuración protege archivos como .htaccess y .htpasswd y directorios como .git y .hg.

RewriteCond %{SCRIPT_FILENAME} -d [OR]
RewriteCond %{SCRIPT_FILENAME} -f
RewriteRule «(^|/)\.» – [F]

 

Si lo prefieres, también puedes devolver un error de tipo 404 (Not Found) para confundir un poco más a los atacantes:

RedirectMatch 404 /\..*$

Impedir que se pueda acceder a archivos con contenidos sensibles

Las siguientes extensiones corresponden a los archivos que pueden contener información sensible, como por ejemplo: archivos de log con información detallada del servidor (.log), copias de seguridad creadas por editores como Vi/Vim (.swp), comandos de consola (.sh), archivos de configuración (.config, .ini), etc.

<FilesMatch «(\.(bak|config|dist|fla|inc|ini|log|psd|sh|sql|swp)|~)$»>
    Order allow,deny
    Deny from all
    Satisfy All
</FilesMatch>

 

Impedir que se pueda ver el listado de contenidos de un directorio

Options AllIndexes

Impedir que otros sitios web enlacen a tus imágenes

La siguiente configuración impide que se pueda enlazar a tus imágenes. Cambia el valor tuweb.com por tu propio dominio:

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

 

Proteger el acceso a un directorio mediante 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

Utiliza el archivo creado para proteger con contraseña el acceso a cualquier directorio:

AuthType Basic
AuthName «Directorio Seguro»
AuthUserFile /home/usuario/.htpasswd
Require valid-user

 

Proteger uno o varios archivos mediante contraseña

AuthName «Directorio Seguro»
AuthType Basic
AuthUserFile /home/usuario/.htpasswd
 
<Files «archivo_secreto.doc»>
Require valid-user
</Files>
 
<FilesMatch ^(copia\d+\.zip)$>
Require valid-user
</FilesMatch>

 

Otros trucos

Páginas de error personalizadas

ErrorDocument 400 /errores/error400.html
ErrorDocument 401 /errores/error401.html
ErrorDocument 403 /errores/error403.html
ErrorDocument 404 /errores/error404.html
ErrorDocument 500 /errores/error500.html

 

Definir opciones de configuración PHP

Utiliza la directiva especial php_value y a continuación, indica el nombre de la opción y su valor separado por un espacio:

php_value <nombre-opcion> <valor-opcion>

Este ejemplo define el tiempo máximo de ejecución de los scripts PHP y el tamaño máximo de los archivos que se pueden subir:

# Por ejemplo:
php_value upload_max_filesize 25M
php_value max_execution_time 500

 

Permitir la carga de fuentes desde diferentes dominios

Debido a las restricciones del Cross-origin Resource Sharing, es posible que algunas fuentes servidas a través de una CDN no funcionen en Firefox o Internet Explorer. Para solucionarlo, utiliza la siguiente configuración:

<IfModule mod_headers.c>
    <FilesMatch «\.(eot|otf|ttc|ttf|woff)$»>
        Header set Access-Control-Allow-Origin «*»
    </FilesMatch>
</IfModule>

 

Forzar el uso de la codificación UTF-8

# Servir contenidos de tipo text/plain o text/html usando la codificación UTF-8
AddDefaultCharset utf-8
 
# Forzar la codificación UTF-8 en varios tipos de archivos
AddCharset utf-8 .atom .css .js .json .rss .vtt .xml

 

Espero que os haya sido de ayuda o cuando menos interesante.

Leave a Reply

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

ACEPTAR
Aviso de cookies