¿Qué es .htaccess?
El archivo .htaccess (hypertext access) se utiliza como uno de los medios para una configuración sencilla y cómoda del servidor web Apache. Por lo tanto, cambiar la configuración del servidor web permite modificar el funcionamiento del sitio. Habitualmente htaccess se encuentra en el directorio raíz e influye en todos sus subdirectorios y en el sitio web. Si existe otro archivo .htaccess en otro directorio, solo afectará al directorio en cuestión y a sus subdirectorios.
Nota Hacer cambios en el archivo .htaccess puede interrumpir gravemente el funcionamiento del sitio. Cualquier error al modificar el archivo puede causar consecuencias serias, incluso la disminución o la pérdida total del posicionamiento en buscadores del sitio, sin tener efectos visibles en su rendimiento. Por ello se recomienda crear una copia de seguridad antes de realizar cualquier acción.
¿Dónde se encuentra el archivo .htaccess?
Normalmente se encuentra en el directorio raíz. En algunas CMS puedes encontrar htaccess.txt en lugar de .htaccess. Este archivo no tiene efecto en el servidor y no se usa activamente. Para que el archivo funcione correctamente, debes cambiar la extensión a .htaccess. Si no es posible hacerlo desde tu ordenador, accede a tu servidor mediante un cliente FTP y renombra el archivo directamente en el servidor.
Puedes editar el archivo en tu ordenador con cualquier editor de texto, aunque aconsejamos Notepad++ para evitar problemas.
¿Cómo comprobar si .htaccess está funcionando?
Basta con escribir cualquier palabra aleatoria en la primera línea del archivo, guardarlo y sustituir el que está actualmente en el servidor. Si el sitio sigue funcionando con normalidad, .htaccess no está operando. Si obtienes un Internal Server Error 500, el servidor web no pudo procesar el comando (la palabra aleatoria). Esto confirmará que el archivo .htaccess está activo en ese momento. Para restaurar el sitio simplemente elimina la palabra aleatoria.
Más adelante veremos las funciones útiles del archivo.
- Redirección entre páginas o sitios + cambio de URL
- Gestión de errores
- Configuración de seguridad del sitio
- Codificación de las páginas del sitio
- Optimización del sitio
- Configuración de PHP
Configuración correcta de redirecciones 301 mediante el archivo .htaccess
Nota Para que la redirección funcione, asegúrate de escribir ‘RewriteEngine On’ antes de las líneas indicadas a continuación.
RewriteEngine On
Redirección 301 a otra página o sitio
Introduce las siguientes líneas en el archivo .htaccess:
Redirect 301 /oldpage.html http://website.com/newpage.html
o
RedirectPermanent /oldpage.html http://website.com/newpage.html
Redirección 301 del subdominio www al dominio o redirección de www.site.com a site.com
Por ejemplo, de http://www.site.com a http://site.com. Es bastante útil y común en SEO
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.domain\.com$ [NC]
RewriteRule ^(.*)$ http://domain.com/$1 [R=301,L]
Redirección inversa de una dirección ‘sin www’ a ‘con www’
Redirección de http://site.com a http://www.site.com (no recomendamos usar esta)
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]
Redirigir a todos los usuarios de un sitio antiguo a uno nuevo
Redirect 301 / http://newsite.com/
¿Cómo añadir .html al final de una URL?
Si quieres que el usuario sea enviado a site.com/page.html cuando introduzca site.com/page o site.com/page/ escribe el siguiente texto en el archivo .htaccess:
RewriteCond %{REQUEST_URI} (.*/[^/.]+)($|\?)
RewriteRule .* %1.html [R=301,L]
RewriteRule ^(.*)/$ /$1.html [R=301,L]
¿Cómo quitar .html al final de la URL?
Redirección inversa de site.com/page.html a site.com/page
RewriteBase /
RewriteRule (.*)\.html$ $1 [R=301,L]
¿Cómo quitar la barra final en la URL?
Por ejemplo, de site.com/page/ a site.com/page
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ /$1 [R=301,L]
Redirección 301 de una sección del sitio a otra
Redirigir todas las páginas de una sección del sitio site.com/section-1/section-2/page a otra site.com/section-1/page
RewriteRule ^blog/random/(.*)$ http://site.com/blog/$1 [R=permanent,L]
Redirección 301 al migrar a otro dominio
Las siguientes líneas en el archivo .htaccess redirigirán a los usuarios desde cada página específica del sitio antiguo a la correspondiente del nuevo sitio. Por ejemplo, para redirigir oldsite.com/page a newsite.com/page
RewriteCond %{HTTP_HOST} ^www.oldsite.com$ [NC,OR]
RewriteCond %{HTTP_HOST} ^test.oldsite.com$ [NC]
RewriteRule ^(.*)$ http://newsite.com/$1 [R=301,L]
Edición de páginas de error mediante .htaccess
Cuando el usuario carga el sitio (envía una solicitud al servidor del proveedor de hosting), el servidor devuelve una respuesta con un código. Los códigos 1-399 significan que el servidor funciona correctamente y 400-599 indican un error del servidor (aquí tienes nuestro artículo sobre los códigos de error del servidor).
Si, por ejemplo, el servidor que aloja tu sitio está sobrecargado, se reiniciará y el usuario verá una página de error con un texto concreto (como 500 Internal Server Error). Puede pensar que el sitio ya no funciona y no volver jamás. Una solución común es crear una página de error personalizada en lugar de la página 404 estándar. Este error informa al usuario de que la página con la URL introducida no existe.
Los webmasters experimentados crean su propia página en lugar de la predeterminada. Indica que la persona siguió un enlace que no existe y ofrece buscar la información necesaria en el sitio en lugar de abandonarlo. Este es un ejemplo de una página de error 404.
Para mostrar tu página de error personalizada en lugar de la predeterminada, debes crear una página aparte (por ejemplo, http://yoursite.com/404.html) y añadir el código correspondiente en el archivo .htaccess. Aquí tienes algunos ejemplos de código que puedes añadir:
ErrorDocument 400 http://yoursite.com/400.html
ErrorDocument 404 http://yoursite.com/404.html
ErrorDocument 500 http://yoursite.com/500.html
Si quieres una página distinta para el Error 403 (acceso denegado), también puedes escribir un mensaje de texto que se mostrará, por ejemplo:
ErrorDocument 403 "Sorry can't allow you access today, see you later alligator :)"
Configuración de seguridad del sitio mediante el archivo .htaccess
El archivo .htaccess ofrece algunas posibilidades para mejorar la seguridad del sitio. Estas son las más habituales:
Protección del sitio contra inyecciones de scripts
#Enables sym (symbolic) links tracking
Options +FollowSymLinks
#Runs url_rewriting
RewriteEngine On
#Blocks all links containing<script>
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
#Blocks all scripts that attempt to change PHP Globals variables:
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
#Blocks all scripts that attempt to change _REQUEST variable:
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
#Redirects all similar attempts to 403 Error page – denied
RewriteRule ^(.*)$ index.php [F,L]
Esta configuración es más un componente de seguridad del sitio que una garantía al 100%.
Protección frente al robo de imágenes
Algunos webmasters deshonestos pueden averiguar la ruta a una imagen de tu sitio e introducirla en el script de su página. La página principal de su sitio se carga desde su servidor y la imagen, desde el tuyo. Eso les permite ahorrar su tráfico usando el tuyo.
Options +FollowSymlinks
#Blocks image theft
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www.)?yoursite.com/ [nc]
RewriteRule .*.(gif|jpg|png)$ http://yoursite.com/images/stop_stealing.gif[nc]
Restricción de acceso por dirección IP
Se usa contra spammers y otros visitantes no deseados y, raramente, para prevenir ataques de hackers
#Entering IP’s to ban this way
allow from all
deny from 164.186.15.116
deny from 124.153.34.144
Bloquear todas las IP excepto las de confianza
Para bloquear el acceso a tu sitio desde todas las IP excepto algunas específicas, debes añadir el siguiente código:
#Restricts access for all but listed
ErrorDocument 403 http://www.yoursite.com
Order deny,allow
Deny from all
Allow from 164.186.15.116
Allow from 124.153.34.144
Restringir el acceso a una carpeta específica
#Restricts specific folder content review
Options All -Indexes
Restringir el acceso a un archivo específico
#Protects file myfile.txt
<files myfile.txt>
order allow,deny
deny from all
</files>
Restringir el acceso a todos los archivos con una extensión específica
Por ejemplo, para restringir el acceso a todos los archivos .txt, debes introducir lo siguiente:
<Files "\.(txt)$">
Order Deny,Allow
Deny from all
</Files>
Bloqueo de user agents no deseados
Normalmente, en tus navegadores hay instaladas muchas extensiones. Estas extensiones transmiten información al servidor que aloja tu sitio. La misma información la envían aplicaciones instaladas en el PC del usuario y todo tipo de robots y spiders.
#Blocks all User Agents listed below
SetEnvIfNoCase user-Agent ^FrontPage [NC,OR]
SetEnvIfNoCase user-Agent ^Java.* [NC,OR]
SetEnvIfNoCase user-Agent ^Microsoft.URL [NC,OR]
SetEnvIfNoCase user-Agent ^MSFrontPage [NC,OR]
SetEnvIfNoCase user-Agent ^Offline.Explorer [NC,OR]
SetEnvIfNoCase user-Agent ^[Ww]eb[Bb]andit [NC,OR]
SetEnvIfNoCase user-Agent ^Zeus [NC]
<limit get="" post="" head="">
Order Allow,Deny
Allow from all
Deny from env=bad_bot
</limit>
Cambiar la codificación del sitio mediante .htaccess
El contenido del sitio puede mostrarse normalmente para algunos usuarios y como símbolos desconocidos en lugar de letras para otros. La razón de esto es una codificación del sitio configurada incorrectamente. Para garantizar que todos los navegadores carguen el contenido correctamente, el sitio usa una de las codificaciones más habituales:
- UTF-8 - codificación universal de dos bytes
- Windows-1251 - Cirílico (Windows)
- cp866 – Cirílico (DOS)
- Windows-1250 – Europa Central (Windows)
- Windows-1252 – Europa Occidental (Windows)
La codificación también debe mencionarse en la metaetiqueta de cada página para que el navegador sepa con qué codificación se creó la página:
<meta http-equiv="content-type" content="text/html; charset=Windows-1251">
Si no se añade la metaetiqueta anterior, puedes informar al navegador de la codificación de tu sitio usando el archivo .htaccess:
AddDefaultCharset WINDOWS-1251
En caso de que funcionen tanto la metaetiqueta como .htaccess, es importante que la codificación coincida.
También es posible que el servidor codifique automáticamente todos los archivos que se añadan a él, agregando esta línea:
CharsetSourceEnc WINDOWS-1251
Para desactivar esta función debes introducir:
CharsetDisable on
Optimización del sitio mediante .htaccess
Compresión de archivos con gZip
Activar esta utilidad permite al servidor comprimir los datos antes de enviarlos al usuario. En resumen, aumentas la velocidad del sitio a costa de algo más de carga en el servidor, ya que tendrá que comprimir los datos. Debes añadir código para activar gZip en tu archivo .htaccess. Prueba cada una de las 3 versiones siguientes y verifica la mejora de velocidad para cada una aquí. Agradeceremos mucho un comentario con tu experiencia sobre la efectividad de estas opciones.
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/javascript text/css application/x-javascript
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch bMSIE !no-gzip !gzip-only-text/html
<ifmodule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_item_include file \.js$
mod_gzip_item_include file \.css$ </ifmodule>
</IfModule>
o
FileETag MTime Size
<ifmodule mod_expires.c>
<filesmatch ".(jpg|jpeg|gif|png|ico|css|js)$">
ExpiresActive on
ExpiresDefault "access plus 1 month"
</filesmatch>
</ifmodule>
o
<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>
¿Cómo mejorar la caché del sitio en el servidor?
Una mejor caché permite recuperar datos desde el PC del usuario en lugar de cargarlos del servidor cada vez (imágenes, elementos principales del diseño, etc.) que el usuario ya cargó al entrar por primera vez en el sitio. Por lo tanto, para cada usuario, a partir de la segunda visita el sitio cargará más rápido y la carga sobre tu servidor disminuirá significativamente. Puedes activar una caché mejorada introduciendo uno de los dos códigos siguientes. Prueba cada uno y comprueba la velocidad aquí. Agradeceremos mucho un comentario con tu experiencia sobre la efectividad de cada uno.
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType application/javascript "access plus 7 days"
ExpiresByType text/javascript "access plus 7 days"
ExpiresByType text/css "access plus 7 days"
ExpiresByType image/gif "access plus 7 days"
ExpiresByType image/jpeg "access plus 7 days"
ExpiresByType image/png "access plus 7 days"
</IfModule>
o
FileETag MTime Size
<ifmodule mod_expires.c>
<filesmatch ".(jpg|gif|png|css|js)$">
ExpiresActive on
ExpiresDefault "access plus 1 month"
</filesmatch>
</ifmodule>
TTL (Time to Live) es una configuración específica que permite establecer el tiempo que permanecerá en caché cada porción de datos. Una vez transcurra ese tiempo predefinido, los datos se eliminarán y se realizará una nueva solicitud. Puedes establecer el TTL para los archivos en el ordenador del usuario en la línea “access plus …”. Una vez expirado, estos archivos se cargarán de nuevo cuando el usuario entre en el sitio. Se consideran óptimos plazos de 7 días a 1 mes, aunque a veces se configuran hasta 1 año.
Cambiar la página de inicio del sitio
Cuando un usuario carga tu sitio, la primera página en cargarse es index.html o index.php. Para cambiar la página añade este código al archivo .htaccess (de modo que ahora mypage.php cargará primero):
DirectoryIndex about.html
Configuración de PHP mediante .htaccess
Nota El uso de cualquier directiva para configurar PHP depende de la versión de PHP instalada en el servidor y de las restricciones del proveedor de hosting. Por lo tanto, si una directiva no funcionó o su uso provocó un error en el sitio (y estás seguro de que se usó correctamente), te recomendamos contactar con el soporte técnico del proveedor para especificar la causa del error y cómo corregirlo.
El archivo php.ini contiene todos los ajustes de PHP. Sin embargo, algunos de estos ajustes pueden configurarse en el archivo .htaccess. Debes usar php_flag para valores booleanos (true/false) y php_value para valores numéricos. Estas son las reglas:
php_flag directive1 VALUE1
php_value directive2 VALUE2
Donde VALUE 1 puede ser on, off, 1 o 0 (1 y on significan activar; 0 y off, desactivar);
VALUE2 es cualquier valor numérico o de cadena que se adapte a una directiva específica;
directive1 (solo se usa con php_flag) puede tener los siguientes valores:
magic_quotes_gpc
- activar/desactivar la función magic_quotes_gpc
php_flag magic_quotes_gpc on
Nota Esta directiva se considera obsoleta y se desactivó en PHP 5.4.0 y superiores.
display_startup_errors
- activar/desactivar la visualización de errores de inicio de PHP
php_flag display_startup_errors 1
display_errors
- activar/desactivar la visualización de errores en el navegador
php_flag display_errors 1
output_buffering
- activar/desactivar el buffer de salida de datos
>php_flag output_buffering on
register_globals
- activar/desactivar las variables globales
php_flag register_globals on
engine
- activar/desactivar la ejecución de PHP en la carpeta de .htaccess y subcarpetas
php_flag engine off
directive2 (solo se usa con php_value) puede tener los siguientes valores:
upload_max_filesize
- establece el tamaño máximo de los archivos subidos
php_value upload_max_filesize 10M
user_agent
- define el valor de user_agent que pasa el servidor
php_value user_agent “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)”
post_max_size
- establece el tamaño máximo del correo enviado
php_value post_max_size 10M
mysql.default_user
- establece el nombre del usuario de la base de datos
php_value mysql.default_user databaseuser
mysql.default_password
- establece la contraseña del usuario de la base de datos
php_value mysql.default_password jk323jh4g
mysql.default_host
- establece el nombre del host de la base de datos (normalmente localhost)
php_value mysql.default_host localhost
sendmail_from
- establece la dirección desde la que se envía el correo usando PHP php_value sendmail_from
php_value sendmail_from
auto_prepend_file
- establece el archivo que se añadirá al principio de cada script PHP
php_value auto_prepend_file /www/publiс_html/myfile.php
auto_append_file
- establece el archivo que se añadirá al final de cada script PHP
php_value auto_append_file /www/publiс_html/myfile.php
Nota No todos los proveedores de hosting permiten realizar cambios en la configuración de PHP mediante .htaccess. Te recomendamos consultar este asunto con el soporte técnico.
Algunos consejos para trabajar con .htaccess
Dado que el archivo .htaccess permite cambiar algunos ajustes del servidor de hosting, aconsejamos consultar con su soporte (o leer su FAQ) sobre el uso de determinadas directivas.
El proveedor de hosting podría restringir o sustituir algunas directivas según la versión de Apache.
Por ejemplo, algunos proveedores de hosting prohíben usar la función ‘strtoupper’ que convierte una cadena a mayúsculas porque aumenta significativamente la carga del servidor web.
También podrías revisar las siguientes directivas:
Options +FollowSymLinks puede sustituirse por Options +SymLinksifOwnerMatch
Options All-Indexes puede sustituirse por Options-Indexes
Es posible que algunas directivas no se utilicen en una versión concreta de Apache, por lo tanto, deben eliminarse o comentarse.
Puedes comentar una directiva colocando # al principio de la línea.
Por ello, recomendamos encarecidamente estudiar las directivas disponibles para configurar el archivo .htaccess. Ayudará a evitar un mensaje de error relacionado con .htaccess en lugar de que el sitio cargue correctamente.
