LinuxParty
Este artículo recopila los trucos y ejemplos de configuración más útiles para el arhivo .htaccess
del servidor web Apache.
Redirección y reescritura de URL
Para que funcionen correctamente los ejemplos de configuración mostrados en esta sección, debes tener el módulo mod_rewrite
instalado y activado en el servidor.
Forzar a 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} ^ejemplo\.com [NC] RewriteRule ^(.*)$ http://www.ejemplo.com/$1 [L,R=301,NC]
Esta configuración funciona tanto para las URL seguras (https://
) como para las URL normales (http://
):
RewriteCond %{HTTP_HOST} !^$ RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteCond %{HTTPS}s ^on(s)| RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Forzar a 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]
Forzar a que todas las URL sean seguras y empiecen por https
RewriteEngine on RewriteCond %{HTTPS} !on RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Forzar a que todas las URL acaben con la barra /
RewriteCond %{REQUEST_URI} /+[^\.]+$ RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]
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/
Redirigir todo un sitio web
Redirect 301 / http://nuevo_sitio.com/
A pesar de que esta configuración sencilla no lo parezca, en realidad se están redirigiendo todos los enlaces viejos al nuevo sitio, no solo la portada del sitio.
Redirigir todo un sitio web, con todo su tráfico y sitios URL
redirectMatch 301 ^(.*)$ https://www.SITIONUEVO.es$1
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 "apagarlo" y hacerlo desaparecer de Internet:
Deny from All # en Apache 2.4, utiliza lo siguiente # Require all denied
Impedir cualquier acceso salvo aquellos autorizados
Order deny, allow Deny from All Allow from xxx.xxx.xxx.xxx # en Apache 2.4, utiliza lo siguiente # Require ip xxx.xxx.xxx.xxx
Sustituye xxx.xxx.xxx.xxx
por la dirección IP desde la que quieres permitir el acceso al sitio. Esta configuración también soporta la definición de rangos de direcciones IP.
Permitir todos los accesos salvo aquellos desautorizados
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 explícitamente:
Order deny, allow Allow from All Deny from xxx.xxx.xxx.xxx Deny from xxx.xxx.xxx.yyy # en 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 (es decir, aquellos cuyo nombre empieza con un punto) normalmente no son públicos, por lo que el servidor web no debería servirlos:
RewriteCond %{SCRIPT_FILENAME} -d [OR] RewriteCond %{SCRIPT_FILENAME} -f RewriteRule "(^|/)\." - [F]
Entre otros, esta configuración protege archivos como .htaccess
y .htpasswd
y directorios como .git
y .hg
.
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 All -Indexes
Impedir que otros sitios web enlacen a tus imágenes
La siguiente configuración impide que cualquier sitio web externo pueda enlazar a tus imágenes para "robártelas". Cambia el valor ejemplo.com
por tu propio dominio, de manera que solamente tu puedas enlazar a tus imágenes:
RewriteEngine on RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?ejemplo.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
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
Proteger uno o varios archivos mediante contraseña
AuthName "Zona Segura" AuthType Basic AuthUserFile /home/usuario/.htpasswd <Files "archivo_secreto.zip"> Require valid-user </Files> <FilesMatch ^(factura\d+\.pdf)$> Require valid-user </FilesMatch>
Mejorar el rendimiento
Comprimir archivos
<IfModule mod_deflate.c> # Forzar compresión también para las cabeceras malformadas # http://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> # Comprimir los contenidos que sean de cualquiera de estos tipos <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 debe volver a solicitarse al servidor en vez de servirse directamente desde la caché.
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" # CSS ExpiresByType text/css "access plus 1 year" # Archivos relacionados con 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" # Favicon ExpiresByType image/x-icon "access plus 1 week" # 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" # 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" </IfModule>
Desactivar la cabecera ETag
de HTTP
Eliminar la cabecera ETag
de HTTP puede ser útil en algunas situaciones, ya que impide a los proxys y a los navegadores cachear los contenidos en función de esta cabecera. En la práctica, esto fuerza a que los proxys y navegadores utilicen en su lugar las cabeceras Cache-Control
o Expires
:
<IfModule mod_headers.c> Header unset ETag </IfModule> FileETag None
Otros trucos
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:
# For example: php_value upload_max_filesize 30M php_value max_execution_time 600
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
Forzar a que el navegador baje un archivo en vez de mostrarlo
La siguiente configuración hace que todos los archivos de tipo Markdown (extensión .md
) se descarguen en vez de mostrarse dentro del navegador. Cambia la extensión .md
por la extensión de los archivos que quieres forzar que se descarguen:
<Files *.md> ForceType application/octet-stream Header set Content-Disposition attachment </Files>
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
Recursos
-
Apache
- Cómo cambiar el nombre del servidor Apache por cualquier cosa personalizando el servidor
- Cómo instalar Varnish y realizar una evaluación comparativa del servidor web
- 13 consejos para reforzar la seguridad del servidor web Apache en Servidores Linux
- Cómo administrar el servidor Apache usando la herramienta "Apache GUI"
- Crear un sitio web protegido, con usuario y contraseña
- Cómo instalar Joomla en Rocky Linux y AlmaLinux
- Incrementar el rendimiento de su Web usando Nginx como Proxy con Apache
- ¿Cómo usar IPv6 en Apache?
- Cómo configurar HTTPS en Apache Web Server con CentOS
- Usar el comando occ, cómo funciona.
- Redirigir todo tu viejo dominio al nuevo dominio a través de .htaccess
- Ejemplos y Trucos de uso y configuración del htaccess de Apache
- Seguridad de Joomla: Cómo asegurar su sitio web de Joomla durante la instalación
- Securizar tu servidor Web Apache con mod_security
- Asegurar tu servidor Web Apache con ModSecurity