Listado de códigos para .htaccess (Apache)

Mejora tus búsquedas en Google con estos trucos y comandos


  • Tiempo de lectura: 9 minutos
  • Autor: Emirodgar
  • Publicado: 14/03/2022
  • Actualizado: 16/03/2022

Configurar un servidor web debe hacerse con sumo cuidado, ya que podríamos dejar la página inaccesible si no sabemos lo que estamos haciendo. El servidor Apache dispone del fichero .htaccess para gestionar diversos comportamientos y funcionalidades. A continuación encontrarás diversos códigos listos para ser usados en dicho fichero.

  1. Accesos a la página
    1. Forzar el acceso con www
    2. Forzar el acceso sin www
    3. Forzar el acceso seguro con HTTPS
    4. Forzar la barra final
    5. Eliminar la barra final
    6. Configurar páginas asociadas a códigos de estado
    7. Forzar la descarga de un tipo de fichero
    8. Evitar la descarga de un tipo de fichero
  2. Redirecciones
    1. Redirección simple
    2. Redirección de todo el sitio a un nuevo dominio
    3. Redirección de una subcarpeta a otro dominio
    4. Redirección para eliminar una subcarpeta
    5. Redirección para cambiar de subcarpeta
    6. Excluir una URL de ser redireccionada
  3. Seguridad
    1. Que no entre nadie salvo yo (mi ip)
    2. Bloquear acceso a ficheros ocultos y directorios
    3. Bloquear el acceso a los tipos de fichero que queramos
    4. Bloquear la navegación por directorios
    5. Bloquear el hotlinking de imágenes
    6. Bloquear con contraseña el accceso al sitio
    7. Bloquear con contraseña el accceso a ficheros
    8. Evitar que el sitio sea incluido en un iframe
  4. Rendimiento
    1. Comprimir los ficheros de texto
    2. Establecer el tiempo que será cacheado un elemento (expire headers)
    3. Deshabilitar ETags
    4. Codificar los ficheros con UTF-8
    5. Enviar imágenes en formato .WebP
  5. SEO
    1. Activar noindex para todo el sitio

Accesos a la página

En este apartado encontraremos códigos que pueden condicionar el acceso a una página, tanto a nivel de URL como de seguridad.

Forzar el acceso con www

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

Forzar el acceso sin www

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

Forzar el acceso seguro con HTTPS

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

Cuando forzamos el acceso seguro a través de https, es recomendable también habilitar HSTS (HTTP Strict Transport Security) para una configuración de seguridad más completa.

<IfModule mod_headers.c>
    Header always set Strict-Transport-Security "max-age=31536000;includeSubDomains"
</IfModule>

Forzar la barra final

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

Eliminar la barra final

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [R=301,L]

Configurar páginas asociadas a códigos de estado

ErrorDocument 500 "Ha ocurrido un error 500."
ErrorDocument 401 http://error.example.com/mordor.html
ErrorDocument 404 /errors/halflife3.html

Forzar la descarga de un tipo de fichero

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

Evitar la descarga de un tipo de fichero

<FilesMatch "\.(tex|log|aux)$">
    Header set Content-Type text/plain
</FilesMatch>

Redirecciones

Cuando realizamos una migración SEO es vital que apliquemos redirecciones para ayudar tanto a buscadores como a usuarios a entender la nueva estructura de URL.

Redirección simple

Redirect 301 /seo.html http://chuletaseo.com/seo.html
Redirect 301 /posicionamiento-web.html /seo.html

Redirección de todo el sitio a un nuevo dominio

Redirect 301 / https://chuletaseo.org/

Redirección de una subcarpeta a otro dominio

RedirectMatch 301 /seo(.*) https://chuletaseo.org/seo/$1

Redirección para eliminar una subcarpeta

RedirectMatch 301 ^/seo/(.*)$ /$1

Redirección para cambiar de subcarpeta

RedirectMatch 301 ^/seo/(.*)$ /posicionamiento-web/$1

Excluir una URL de ser redireccionada

Esto es útil si tenemos un dominio redireccionado y queremos que el fichero robots.txt siga estando accesible para los robots de los buscadores.

RewriteEngine On
RewriteRule ^robots.txt - [L]

Seguridad

Que no entre nadie salvo yo (mi ip)

Si, por seguridad, queremos evitar cualquier acceso al sitio (por ejemplo, en una intranet) podemos configurarlo de la siguiente manera. La parte de xxx.xxx.xxx.xxx deberá ser sustituida por nuestra dirección IP, ya que será la única a la que el servidor permita acceso.

De los siguientes dos bloques sólo tendremos que usar uno de ellos, que dependerá de la versión de Apache que estemos usando, 2.2 o 2.4.

## Apache 2.2
Order deny,allow
Deny from all
Allow from xxx.xxx.xxx.xxx

## Apache 2.4
Require all denied
Require ip xxx.xxx.xxx.xxx

Bloquear acceso a ficheros ocultos y directorios

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

Bloquear el acceso a los tipos de fichero que queramos

Dentro de un servidor web existen muchos ficheros y no sólo los que están orientados a ser ejecutados y accesibles para los visitantes. Por ejemplo, copias de seguridad, logs, archivos de configuración, etc. Con este código podremos determinar aquellos que no queremos que sean accedidos vía web.

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

  ## Apache 2.4
   Require all denied
</FilesMatch>

Sólo debemos utilizar uno de los dos bloques, que dependerá de la versión de Apache que estemos utilizando.

Bloquear la navegación por directorios

De esta forma obligamos a que sólo se pueda acceder a los ficheros que generan un HTML que nosotros controlamos y los usuarios no pueden navegador por los directorios ni visualizar otros elementos no cruciales para la página web.

Options All -Indexes

Bloquear el hotlinking de imágenes

Evita que otras páginas empleen tus imágenes a costa de los recursos de tu servidor web.

RewriteEngine on
# Elimina la siguiente línea si quieres bloquear las peticiones de referers desconocidos
RewriteCond %{HTTP_REFERER} !^$

RewriteCond %{HTTP_REFERER} !^https?://(.+\.)?example.com [NC]
RewriteRule \.(jpe?g|png|gif|bmp)$ - [NC,F,L]

# Si quieres mostrar una imagen avisando del bloqueo, sustituye línea anterior por:
# RewriteRule \.(jpe?g|png|gif|bmp) http://example.com/blocked.png [R,L]

Bloquear con contraseña el accceso al sitio

Necesitarás crear un fichero .htpasswd dentro del servidor web donde se guardarán los datos de acceso. Después bastará con incluir el siguiente código en el fichero .htaccess.

AuthType Basic
AuthName "Nombre"
AuthUserFile /home/fellowship/.htpasswd
Require valid-user

Bloquear con contraseña el accceso a ficheros

AuthName "Nombre"
AuthType Basic
AuthUserFile /home/fellowship/.htpasswd

<Files "one-ring.o">
Require valid-user
</Files>

<FilesMatch ^((one|two|three)-rings?\.o)$>
Require valid-user
</FilesMatch>

Evitar que el sitio sea incluido en un iframe

SetEnvIf Request_URI "/starry-night" allow_framing=true
Header set X-Frame-Options SAMEORIGIN env=!allow_framing

Rendimiento

Comprimir los ficheros de texto

<IfModule mod_deflate.c>

        # Force compression for mangled headers.
        # https://developer.yahoo.com/blogs/ydn/pushing-beyond-gzipping-25601.html
        <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>
    
        # Compress all output labeled with one of the following MIME-types
        # (for Apache versions below 2.3.7, you don't need to enable `mod_filter`
        #  and can remove the `<IfModule mod_filter.c>` and `</IfModule>` lines
        #  as `AddOutputFilterByType` is still in the core directives).
        <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>

Establecer el tiempo que será cacheado un elemento (expire headers)

<IfModule mod_expires.c>
    ExpiresActive on
    ExpiresDefault                                      "access plus 1 month"

  # CSS
    ExpiresByType text/css                              "access plus 1 year"

  # Data interchange
    ExpiresByType application/json                      "access plus 0 seconds"
    ExpiresByType application/xml                       "access plus 0 seconds"
    ExpiresByType text/xml                              "access plus 0 seconds"

  # Favicon (cannot be renamed!)
    ExpiresByType image/x-icon                          "access plus 1 week"

  # HTML components (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 files
    ExpiresByType application/x-web-app-manifest+json   "access plus 0 seconds"
    ExpiresByType text/cache-manifest                   "access plus 0 seconds"

  # Media
    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"

  # Web feeds
    ExpiresByType application/atom+xml                  "access plus 1 hour"
    ExpiresByType application/rss+xml                   "access plus 1 hour"

  # Web fonts
    ExpiresByType application/font-woff2                "access plus 1 month"
    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"
</IfModule>

Deshabilitar ETags

Al eliminar la cabecera ETag, se impide el acceso a las cachés y que los navegadores puedan validar los archivos, por lo que se ven obligados a confiar en la cabecera Cache-Control y Expires que hayamos definido en el punto anterior.

<IfModule mod_headers.c>
    Header unset ETag
</IfModule>
FileETag None

Codificar los ficheros con UTF-8

# Use UTF-8 encoding for anything served text/plain or text/html
AddDefaultCharset utf-8

# Force UTF-8 for a number of file formats
AddCharset utf-8 .atom .css .js .json .rss .vtt .xml

Enviar imágenes en formato .WebP

El siguiente código sólo funcionará si existe un fichero de imagen de mismo nombre pero con extensión .webp de tal forma que si el servidor detecta compatibilidad en el navegador, sustituirá la imagen actual por su versión .webp.

RewriteEngine On
RewriteCond %{HTTP_ACCEPT} image/webp
RewriteCond %{DOCUMENT_ROOT}/$1.webp -f
RewriteRule (.+)\.(jpe?g|png)$ $1.webp [T=image/webp,E=accept:1]

SEO

Activar noindex para todo el sitio

En el caso de que queramos desindexar todo un dominio, podemos activar las directivas noindex y nofollow de la etiqueta meta robots de la siguiente manera:

<ifModule mod_headers.c>
Header set X-Robots-Tag "noindex, nofollow"
</ifModule>

Si lo queremos hacer únicamente para una subcarpeta, deberemos especificarlo así:

<If "%{REQUEST_URI} =~ m#^/seo/#">
Header set X-Robots-Tag "noindex"
</If>

Para más información acerca de la directiva meta robots, podemos ir a la documentación oficial de Google.


Servicios adicionales

Aprovecha al máximo el conocimiento SEO de este portal suscribiéndote a la newsletter que enviamos cada semana con las novedades del mundo SEO. También te ofrecemos recursos y herramientas gratuitas para ser más eficiente en tus estrategias.

Newsletter

Suscribirse a la newsletter en Linkedin

    Más de 2.600 personas están suscritas a nuestra Newsletter de Chuleta SEO y reciben todas las semanas las últimas noticias del sector.

Dashboard

Dashboard SEO gratuito