Controla tu sitio web en Apache con .htaccess

Crear un sitio o una aplicación web es “sencillo”, lo difícil es hacer que funcione correctamente y que tenga seguridad para proteger tu trabajo y la información de tu cliente, htaccess te puede ayudar. Por lo general, cuando configuramos un nuevo sitio web dejamos que el servidor o hosting maneje los parámetros de seguridad y optimización como viene de “fábrica” por decir la configuración general básica.

Si tienes acceso a el archivo httpd o archivo de configuración principal de tu servidor, úsalo, aprovecha al máximo todo lo que te provee tu servidor. No  sólo mejoras el desempeño de tu sitio web, sino también la seguridad.

Si tienes un shared hosting o un servicio al cual no puedes tener acceso a tu archivo de configuración de Apache httpd, entonces, utiliza .htaccess.

Evita usar .htaccess en tus proyectos si tienes acceso a httpd ya que reduce el desempeño del servidor, de lo contrario, aquí algunos tips para mejorar tu proyecto y darle un poco más de seguridad utilizando un archivo .htaccess. Recuerda que este archivo debe estar en la raíz de documentos de tu servidor web:

1.  Página Error 404 personalizada

# ----------------------------------------------------------------------
# Custom 404 page
# ----------------------------------------------------------------------
ErrorDocument 404 /404.html

2. Codificación UTF-8 para todos tus documentos txt y html

# ----------------------------------------------------------------------
# UTF-8 encoding
# ----------------------------------------------------------------------
AddDefaultCharset utf-8

Para otros formatos de archivos puedes utilizar

AddCharset utf-8 .css .js .xml .json .rss .atom

3. Evitar hostname redundantes, principalmente para Google Analytics.
No lo utilices si tienes subdominios públicos, ejemplo: http://cuenta.tusitio.com.

Esto hace que las visitas a http://tusitio.com sean redirigidos a http://www.tusitio.com

<IfModule mod_rewrite.c>
 RewriteCond %{HTTPS} !=on
 RewriteCond %{HTTP_HOST} !^www\..+$ [NC]
 RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>

De lo contrario si quieres hacerlo a la inversa: http://www.tusitio.com hacia http://tusitio.com

<IfModule mod_rewrite.c>
 RewriteCond %{HTTPS} !=on
 RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
 RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]
</IfModule>

4. Cabecera de expiración para mejorar el control de cache, esencial para SEO

<IfModule mod_expires.c>
 ExpiresActive on

# Perhaps better to whitelist expires rules? Perhaps.
 ExpiresDefault "access plus 1 month"

# cache.appcache needs re-requests in FF 3.6 (thanks Remy ~Introducing HTML5)
 ExpiresByType text/cache-manifest "access plus 0 seconds"

# Your document html
 ExpiresByType text/html "access plus 0 seconds"

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

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

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

# Media: images, video, audio
 ExpiresByType image/gif "access plus 1 month"
 ExpiresByType image/png "access plus 1 month"
 ExpiresByType image/jpg "access plus 1 month"
 ExpiresByType image/jpeg "access plus 1 month"
 ExpiresByType video/ogg "access plus 1 month"
 ExpiresByType audio/ogg "access plus 1 month"
 ExpiresByType video/mp4 "access plus 1 month"
 ExpiresByType video/webm "access plus 1 month"

# HTC files (css3pie)
 ExpiresByType text/x-component "access plus 1 month"

# Webfonts
 ExpiresByType application/x-font-ttf "access plus 1 month"
 ExpiresByType font/opentype "access plus 1 month"
 ExpiresByType application/x-font-woff "access plus 1 month"
 ExpiresByType image/svg+xml "access plus 1 month"
 ExpiresByType application/vnd.ms-fontobject "access plus 1 month"

# CSS and JavaScript
 ExpiresByType text/css "access plus 1 year"
 ExpiresByType application/javascript "access plus 1 year"

</IfModule>

5. Habilitar CORS o consultas ajax Cross-domain

<IfModule mod_headers.c>
 Header set Access-Control-Allow-Origin "*"
</IfModule>

6. Mejorar la experiencia para usuarios con IE
Esto obliga a utilizar la versión mas reciente de IE, por ejemplo cuando acceden al sitio desde IE7 o menor :S

<IfModule mod_headers.c>
 Header set X-UA-Compatible "IE=Edge,chrome=1"
 # mod_headers can't match by content-type, but we don't want to send this header on *everything*...
 <FilesMatch "\.(js|css|gif|png|jpe?g|pdf|xml|oga|ogg|m4a|ogv|mp4|m4v|webm|svg|svgz|eot|ttf|otf|woff|ico|webp|appcache|manifest|htc|crx|oex|xpi|safariextz|vcf)$" >
 Header unset X-UA-Compatible
 </FilesMatch>
</IfModule>  

7. Comprimir contenido con Gzip

<IfModule mod_deflate.c>

 # Force deflate for mangled headers developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping/
 <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>

 # HTML, TXT, CSS, JavaScript, JSON, XML, HTC:
 <IfModule filter_module>
 FilterDeclare COMPRESS
 FilterProvider COMPRESS DEFLATE resp=Content-Type $text/html
 FilterProvider COMPRESS DEFLATE resp=Content-Type $text/css
 FilterProvider COMPRESS DEFLATE resp=Content-Type $text/plain
 FilterProvider COMPRESS DEFLATE resp=Content-Type $text/xml
 FilterProvider COMPRESS DEFLATE resp=Content-Type $text/x-component
 FilterProvider COMPRESS DEFLATE resp=Content-Type $application/javascript
 FilterProvider COMPRESS DEFLATE resp=Content-Type $application/json
 FilterProvider COMPRESS DEFLATE resp=Content-Type $application/xml
 FilterProvider COMPRESS DEFLATE resp=Content-Type $application/xhtml+xml
 FilterProvider COMPRESS DEFLATE resp=Content-Type $application/rss+xml
 FilterProvider COMPRESS DEFLATE resp=Content-Type $application/atom+xml
 FilterProvider COMPRESS DEFLATE resp=Content-Type $application/vnd.ms-fontobject
 FilterProvider COMPRESS DEFLATE resp=Content-Type $image/svg+xml
 FilterProvider COMPRESS DEFLATE resp=Content-Type $image/x-icon
 FilterProvider COMPRESS DEFLATE resp=Content-Type $application/x-font-ttf
 FilterProvider COMPRESS DEFLATE resp=Content-Type $font/opentype
 FilterChain COMPRESS
 FilterProtocol COMPRESS DEFLATE change=yes;byteranges=no
 </IfModule>

 <IfModule !mod_filter.c>
 # Legacy versions of Apache
 AddOutputFilterByType DEFLATE text/html text/plain text/css application/json
 AddOutputFilterByType DEFLATE application/javascript
 AddOutputFilterByType DEFLATE text/xml application/xml text/x-component
 AddOutputFilterByType DEFLATE application/xhtml+xml application/rss+xml application/atom+xml
 AddOutputFilterByType DEFLATE image/x-icon image/svg+xml application/vnd.ms-fontobject application/x-font-ttf font/opentype
 </IfModule>

</IfModule>

8. Activar el MOD Rewrite

<IfModule mod_rewrite.c>
 Options +FollowSymlinks
 RewriteEngine On
</IfModule>

o simplemente

RewriteEngine On

9. Bloquear acceso a archivos de backup y archivos fuente

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

10. Evitar que los usuarios vean los directorios sin documento predeterminado (index.html)

<IfModule mod_autoindex.c>
 Options -Indexes
</IfModule>

11. Bloquear acceso a los directorios que empiezan con un punto como carpetas Git

<IfModule mod_rewrite.c>
 RewriteCond %{SCRIPT_FILENAME} -d
 RewriteCond %{SCRIPT_FILENAME} -f
 RewriteRule "(^|/)\." - [F]
</IfModule>