En este tutorial vamos a explicar cómo se configura el archivo ‘.htaccess‘.

Este archivo permite cambiar diferentes directivas a nivel de directorio en un servdior sin necesidad de cambiar la configuración propia del servidor. El formato de estos ficheros es como el del fichero de configuración de Apache. Este archivo suele agregarse en la raíz del servidor y desde ahí gestionar cada directorio y subdirectio que contenga, aunque se puede ubicar un .htaccess en cualquier directorio.

Este archivo se suelen emplear para:

  • Redireccionar tráfico
  • Reescritura de URL
  • Compresión de archivos para reducir el tiempo de carga
  • Bloquear acceso a directorios

Ahora vamos a hablar de unos cuantos ‘trucos’ para configurar este archivo:

  1. Indicar la página por defecto que se ejecutará al acceder al raíz del servidor:
    DirectoryIndex index.html index.php index.htm

  2. Página de error por defecto a la que se redirigen todos los errores 404:
    ErrorDocument 404 /miPaginaDeError.html

  3. Controlar acceso a fichero y directorios, permitiendo o denegando dicho acceso. Situando un fichero ‘.htaccess’ en una carpeta con este contenido se bloquearía el acceso a la misma y a todos sus ficheros a todo el mundo:

    # Bloquear el acceso a todo el mundo
    deny from all

  4. Si queremos bloquear el acceso a todo el mundo pero exceptuando ciertas dirección IPs habría que añadir las siguientes líneas:

    # Bloquear el acceso a todo el mundo
    order deny,allow
    deny from all

    # Dirección a la que si le vamos a permitir acceder
    allow from 192.168.0.0/24

  5. El caso contrario al anterior sería bloquear el acceso únicamente a una dirección IP, y se configuraría de la sigiuente manera:

    # Bloquear el acceso solo a algunas IP's
    order allow,deny

    # Dirección que queremos bloquear
    deny from 192.168.0.0/24

    # Permitir el acceso al resto
    allow from all

  6. Redicciones permanentes (301) de una página a otra dentro de un mismo servidor. Para ello añadir la siguiente línea:

    #Redirect <codigo> <url_antigua> <nueva URL>
    Redirect 301 /antiguo/index.html http://miDominio.com/nuevo/index.html

  7. También nos podría interesar redireccionar todo el contenido de alguna carpeta. Por ejemplo para redireccionar el tráfico a nuestro blog (‘/blog/’) al raíz del sevidor habría que utilizar:

    #Redirect <codigo> <url_antigua con patrón> <nueva URL>
    RedirectMatch 301 /blog(.*) http://yourdomain.com/$1

  8. Configurar la caché de ficheros, configurando el tipo de ficheros que se quiere cachear y el tiempo que dichos contenidos deben permanecer en la caché antes de ser consultados de nuevo:

    # Mantener en caché durante un año
    <FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|swf|mp3|mp4)$">
    Header set Cache-Control "public"
    Header set Expires "Thu, 25 Apr 2014 12:00:00 GMT"
    Header unset Last-Modified
    </FilesMatch>

    # Mantener en caché durante 2 horas
    <FilesMatch "\.(html|htm|xml|txt|xsl)$">
    Header set Cache-Control "max-age=7200, must-revalidate"
    </FilesMatch>

    # SetOutputFilter DEFLATE indica que se deben comprimir los contenidos
    <FilesMatch "\.(js|css)$">
    SetOutputFilter DEFLATE
    Header set Expires "Thu, 25 Apr 2014 12:00:00 GMT"
    </FilesMatch>

  9. Comprimir la salida utilizando GZIP. Añadiendo la siguiente configuración indicaremos que todos los ficheros css,js y html se compriman:

    # El módugo mod_gzip deberá estar habilitado en el servidor
    <IfModule mod_gzip.c>
    mod_gzip_on Yes
    mod_gzip_dechunk Yes
    mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$
    mod_gzip_item_include handler ^cgi-script$
    mod_gzip_item_include mime ^text/.*
    mod_gzip_item_include mime ^application/x-javascript.*
    mod_gzip_item_exclude mime ^image/.*
    mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
    </IfModule>

  10.  Rerigir los buscadores a https (SSL):

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

  11. Reescribir URLs. Por ejemplo para utilizar url amigables, al servidor le llegaría una petición con dicha url y esa debería entenderse como la direccion interna que tiene en el servidor. Por ejemplo:

    # Dirección a la que se está accediendo -> http://www.midominio.com/detalle-producto-14.html
    # Dirección a la que se necesita cambiar -> http://www.midominio.com/detalles.php?id=14
    RewriteEngine on
    RewriteRule ^detalle-producto-([0-9]+)\.html$ detalles.php?id=$1

  12. También puede ser interesante redirigir una página sin ‘www’ a una que si lo contenga:

    # Dirección a la que se está accediendo -> midominio.com/
    # Dirección a la que se necesita cambiar -> http://www.midominio.com/

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^midominio\.com$
    RewriteRule (.*) http://www.midominio.com/$1 [R=301,L]
      
  13. Evitar el acceso al lista de ficheros de una carpeta añadiendo una de las siguientes líneas

    # Para bloquear el listado añadir una de estas dos líneas
    Options -Indexes
    IndexIgnore * 

  14. Añadir nuevos MIME-TYPES para evitar problemas en la descarga de ficheros con mimeType desconocido:

    AddType application/x-endnote-connection enz
    AddType application/x-endnote-filter enf
    AddType application/x-spss-savefile sav

  15. Denegar el acceso a ficheros estáticos si el origen no es por un gestor de contenidos interno como ‘wordpress’ o está vacío:

    RewriteCond %{HTTP_REFERER} !^$
    RewriteCond %{REQUEST_URI} !^/(wp-login.php|wp-admin/|wp-content/plugins/|wp-includes/).* [NC]
    RewriteCond %{HTTP_REFERER} !^http://www.askapache.com.*$ [NC]
    RewriteRule \.(ico|pdf|flv|jpg|jpeg|mp3|mpg|mp4|mov|wav|wmv|png|gif|swf|css|js)$ - [F,NS,L]

  16. Limitar el tamaño máximo de los ficheros que se pueden subir al servidor:

    php_value upload_max_filesize 20M
    php_value post_max_size 20M
    php_value max_execution_time 200
    php_value max_input_time 200

  17. Bloquear la ejecución de scripts:

    Options -ExecCGI
    AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi

  18. Cambiar la codificación y el lenguaje de las cabeceras:

    AddDefaultCharset UTF-8
    DefaultLanguage es-ES


  19.  Configurar el TIMEZONE del servidor:

    SetEnv TZ Europe/Madrid

  20. Forzar que aparezca la venta de “Guardar como” cuando se acceda a ciertos ficheros:

    AddType application/octet-stream .avi .mpg .mov .pdf .xls .mp4

  21. Protección de un fichero individual. Si se quiere únicamente aplicar la configuración a un único fichero sin verse afectado el resto de contenidos del servidor, añadir estas líneas:

    <Files miPagina.html>
    order deny,allow
    deny from all
    AuthType Basic
    AuthName "Usuario Auth"
    AuthLDAP on
    AuthLDAPServer ldap://listado.miDominio.com/
    AuthLDAPBase "ou=Usuario, o=Developando company, c=au"
    require valid-user
    satisfy any
    </Files> 

  22. Configuración de cookies. Crear cookie utilizando alguna de las variables de entorno:

    Header set Set-Cookie "language=%{lang}e; path=/;" env=lang

  23. Crear cookie utilizando las cabeceras de la petición que se recibe en el servidor:

    RewriteEngine On
    RewriteBase /
    RewriteRule ^(.*)(de|es|fr|it|ja|ru|en)/$ - [co=lang:$2:.miDominio.com:7200:/]
  24. Envío de cabeceras:

    Header set Content-Language "es-ES"
    Header set Vary "Accept-Encoding"
     
  25. Bloquear el acceso comparando por User-Agent que se recibe en las cabeceras de la petición:

    SetEnvIfNoCase ^User-Agent$ .*(craftbot|download|extract|stripper|sucker|ninja|clshttp|webspider|leacher|collector|grabber|webpictures) HTTP_SAFE_BADBOT
    SetEnvIfNoCase ^User-Agent$ .*(libwww-perl|aesop_com_spiderman) HTTP_SAFE_BADBOT
    Deny from env=HTTP_SAFE_BADBOT
  26. Redirigir url de una carpeta a otra carpeta del mismo dominio

    Una Redirección 301 útil cuando cometemos el error de indicar una carpeta nombrada de forma incorrecta o que fue renombrada posteriormente es la siguiente, de forma que podamos redireccionar peticiones que vayan a /carpeta1/ para que aterricen en /carpeta2/

    Se deben añadir este tipo de redirecciones en el archivo .htaccess, en la parte más alta del mismo posible:

    Options +FollowSymLinks
    RewriteEngine On
    RewriteRule ^carpeta1/(.*)$ http://dominio.com/carpeta2/$1 [R=301,L]

  27. Redirigir un dominio a otro dominio

    Para evitar que las urls se vean afectadas al cambiar de un dominio a otro dominio es conveniente que hagas la siguiente redirección en .htaccess de forma que quieres vengan de enlaces de la antigua url aterricen en la nueva url de forma correcta, lo contrario afectaría al posicionamiento y habría un aumento de pérdida de tráfico.

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^anteriordominio.com$ [OR]
    RewriteCond %{HTTP_HOST} ^www.anteriordominio.com$
    RewriteRule (.*)$ http://www.nuevodominio.com/$1 [R=301,L]
    </IfModule>

  28. Redirigir del localhost (tu PC) a un dominio remoto

    Con esta regla puedes redireccionar de localhost (tu ordenador) a tu sitio web remoto (Hosting):
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^localhost$
    RewriteRule (.*)$ http://www.dominio.com/$1 [R=301,L]

    Si solo quieres redireccionar un subdominio concreto puedes crear la siguiente regla en tu .htaccess:

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^subdominio.dominio.com$
    RewriteRule (.*)$ http://www.nuevodominio.com/$1 [R=301,L]

    Una forma más sencilla de hacer esto con comodines es creando una regla en .htaccess como la siguiente:
    Redirect 301 (.*)$ http://www.nuevodominio.com/$1

  29. Prevenir el hotlinking

    A veces, otros webmasters, hacen suyas las imágenes de nuestras webs, artículos, etc., afectando con ello el ancho de banda de que disponemos en nuestro Hosting. Si además ellos tienen una gran cantidad de visitantes al día, estos van a utilizar nuestro ancho de banda del servidor para visualizar nuestras imágenes en la web ajena a nosotros.

    Se puede utilizar el código que se muestra a continuación para evitar el hotlinking, y de esta forma reemplazar la imagen original por otra con algún aviso para hacerles saber que la imagen es nuestra o que el hotlinking es una mala práctica.

    RewriteEngine On
    RewriteCond %{HTTP_REFERER} !^http://(.+\.)?webempresa\.com/ [NC]
    RewriteCond %{HTTP_REFERER} !^$
    RewriteRule .*\.(jpg|gif|bmp|png)$ http://hotlink.webempresa.com/no_se_permite_hotlinking.jpg [L]

  30. Cambiar la ubicación de la carpeta de dominio a otra carpeta de /public_html

    Si ya tienes un sitio web en /public_html, y quieres actualizar la página web, pero no quieres que los demás lo vean, pero tampoco quieres afectar al sitio web en producción existente, la forma más fácil es la construcción de la nueva página web en una subcarpeta de /public_html, por ejemplo, /public_html/web2.

    Al finalizar todas las pruebas y mejoras, necesitas reemplazar el antiguo sitio web con el nuevo, pero transferir archivos y carpetas a la carpeta /public_html es bastante molesto. La mejor solución es usar.htaccess para decirle a Apache que utilice la carpeta /public_html/web2 en lugar de /public_html para el dominio.

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^webempresa\.com$ [OR]
    RewriteCond %{HTTP_HOST} ^www\.webempresa\.com$
    RewriteCond %{REQUEST_URI} !^/web2/
    RewriteRule (.*) /web2/$1 [L]

  31. Crear URLs de uso fácil o "amigables"

    ¿Cuál de las dos URL a continuación parece más amigable?
    http://tusitio.com/acercade
    http://tusitio.com/paginas/acercade.html

    Cuando se trata de direcciones URL, siempre y cuando el significado sea claro, cuanto más corto es, mejor. htaccess con una llamada al módulo de Apache mod_rewrite permite configurar las direcciones URL como quieras. El servidor puede mostrar el contenido de "/paginas/acercade.html" cada vez que alguien visita "http://tusitio.com/acercade".

    A continuación algunos ejemplos:

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

  32. Forzar el uso de SSL

    Este código fuerza a utilizar SSL, no permitiendo conexiones http. Para evitar escuchas en http:// utilizamos por debajo la directiva ErrorDocument.

    SSLOptions + StrictRequire
    SSLRequireSSL

    Cuando una línea comienza por # es un comentario que no tiene ningún efecto.

    Si alguien visita tu sitio el servidor web Apache verifica si tiene un archivo .htaccess en algún lugar de su espacio web a partir de la carpeta raíz o la carpeta principal y rastrea todas las carpetas hasta llegar al archivo solicitado. Si encuentra un archivo .htaccess, sus directivas se aplican a la solicitud actual.

    Es importante saber que el archivo .htaccess debe ser legible por el servidor Apache. Por tanto es importante consultar con su Hosting si se requiere algún permiso especial que hayan establecido para los archivos .htaccess. En general los permisos correctos para este archivo son 644.

  33. Redireccionar de HTTP a HTTPS

    Cabe decir que es necesario disponer de un Certificado SSL instalado en el Hosting para poder hacer uso de este protocolo más seguro.

    RewriteEngine On
    RewriteCond %{ENV:HTTPS} !on [NC]
    RewriteCond %{HTTP_HOST} ^tu_dominio\.com$ [OR]
    RewriteCond %{HTTP_HOST} ^www\.tu_dominio\.com$
    RewriteRule ^(.*)$ https://tudominio.com/$1 [R=301,L,NE]

    Pueden existir casos en los que queramos añadir excepciones en el forzado de la redirección de HTTP a HTTPS (por ejemplo, la página de notificación de Redsys). Esto lo podemos hacer añadiendo una línea de código adicional. Si por ejemplo, queremos añadir una excepción para la url https://tudominio.com/?wc-api=WC_redsys habría que dejar el código anterior de la siguiente forma:

    RewriteEngine On
    RewriteCond %{ENV:HTTPS} !on [NC]
    RewriteCond %{QUERY_STRING} !wc-api [NC]
    RewriteCond %{HTTP_HOST} ^tu_dominio\.com$ [OR]
    RewriteCond %{HTTP_HOST} ^www\.tu_dominio\.com$
    RewriteRule ^(.*)$ https://tudominio.com/$1 [R=301,L,NE]

    Otro ejemplo: si no queremos forzar el uso del HTTPS para la url https://tudominio.com/blog/entrada1.html tendremos que poner un código como el siguiente:

    RewriteEngine On
    RewriteCond %{ENV:HTTPS} !on [NC]
    RewriteCond %{REQUEST_URI} !\/blog\/entrada1\.html$ [NC]
    RewriteCond %{HTTP_HOST} ^tu_dominio\.com$ [OR]
    RewriteCond %{HTTP_HOST} ^www\.tu_dominio\.com$
    RewriteRule ^(.*)$ https://tudominio.com/$1 [R=301,L,NE]

  34. Redireccionar de HTTPS a HTTP

    Puede darse el caso que aún teniendo un Certificado SSL instalado (Comodo, Let's Encrypt, etc) quieras forzar el tráfico encriptado SSL para que se sirva con HTTP por diversas razones (pruebas con plugins conflictivos, configuración de una pasarela pago que no trabaja bien por HTTPS, etc), en cuyo caso códigos como el siguiente te permitirán pasar de HTTPS a HTTP sin desinstalar el Certificado SSL de tu Hosting.

    RewriteEngine On
    RewriteCond %{ENV:HTTPS} on [NC]
    RewriteCond %{HTTP_HOST} ^tu_dominio\.com$ [OR]
    RewriteCond %{HTTP_HOST} ^www\.tu_dominio\.com$
    RewriteRule ^(.*)$ http://tudominio.com/$1 [R=301,L,NE]

    Este código debes colocarlo por encima de cualquier otro código de redireccionamiento, al principio del archivo .htaccess.