Como diseñador de páginas web o programador, o simplemente para mantener el software de su alojamiento de páginas web, es importante saber como utilizar el archivo .htaccess. Una herramienta muy poderosa, que incluso le podrá ayudar para proteger su sitio, del robo de ancho de banda (uso de imágenes y archivos sin permiso), denegación de acceso a los denominados BadBots, y medidas de seguridad. Te proponemos una serie de ejemplos, que no los únicos, y unos enlaces que esperamos sean de utilidad.
Contenidos
Para que las reglas de htaccess funcionen, lo primero es que el motor de reescritura (rewrite) debe estar encendido
Options -Indexes +FollowSymLinks
RewriteEngine On
Existen muchos motivos para crear redireciones básicas en nuestro fichero .htaccess. Por ejemplo un cambio de estructura en las URL de sus nueva web, un cambio de software que trata de diferente forma las URL de los artículos de tu blog. En cualquier caso, quieres conservar las viejas direcciones para que los enlaces existentes en Internet sigan funcionando, algo muy importante para el SEO de tu sitio web.
RewriteRule ^nombre-antiguo.php$ /nombre-nuevo.php [R=301,L]
La primera parte de la regla es la que atiende la solicitud realizada al navegador nombre-antiguo.php y dirigirá al visitante a la segunda parte de la regla o destino nombre-nuevo.php. En la última parte estamos usando unas banderas de redirección, indicando el atributo 301, que es indica que es una redirección permanente. Si se utiliza R sin el código, por defecto Apache envía un código 302, que indica que es una redirección temporal.
La / delante de la solicitud de destino, especifica la ruta base para el destino. Esto es necesario porque no lo indicamos previamente. Podemos indicar la dirección base con el código:
RewriteBase /
La base para las URL reescritura siempre será la raíz de tu sitio web. Esto es importante a tener en cuenta cuando el sitio web, esta ubicado en una carpeta distinta del DocumentRoot en la configuración del servidor web Apache.
Una manera de usar redirecciones sin usar mod_rewrite es usando mod_alias en su lugar:
Redirect 301 /nombre-antiguo.php http://www.domain.com/nombre-nuevo.php
Redirect Permanent /nombre-antiguo.php http://www.domain.com/nombre-nuevo.php
Ambas líneas de código hacen lo mismo pero sólo pero sólo tendrá que usar una.
Aunque es algo antiguo, es bueno conocerlo. Hemos migrado de HTML a PHP, usando los viejos nombres. Podemos hacer una regla (una sola) para redirigir a la nueva extensión.
RewriteRule ^(.*).html /$1.php [R=301,L]
Cada vez que el navegador solicite un archivo con la extensión .html, será redirigido al mismo archivo pero con la nueva extensión .php.
También podemos cambiar la forma en que el servidor web Apache, trata nuestros archivos .html, actuando como archivos php, modificando el tipo .html
AddType application/x-httpd-php .php .html .htm
Podemos eliminar la extensión de nuestros ficheros web, con el fin de dar un aspecto más humano y menos orientado a programación o informática.
RewriteRule ^(.*)/$ /$1.php [L]
Así que podríamos tener un montón de archivos en nuestro directorio raíz que antes se veían así:
http://www.midominio.com/servicios.php
http://www.midominio.com/productos.php
http://www.midominio.com/acerca.php
http://www.domain.com/enlaces.php
http://www.domain.com/contacto.php
Y en vez podrían tener este aspecto:
http://www.midominio.com/servicios
http://www.midominio.com/productos
http://www.midominio.com/acerca
http://www.midominio.com/enlaces
http://www.midominio.com/contacto
Si deseamos que terminen en / entonces usaríamos el siguiente código:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/$ $1.html
RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule (.*)$ /$1/ [R=301,L]
Y entonces la URL sería:
http://www.midominio.com/servicios/
http://www.midominio.com/productos/
http://www.midominio.com/acerca/
http://www.midominio.com/enlaces/
http://www.midominio.com/contacto/
Una de las controversias más conocidas es el uso o no, de las www. Una vez más el mundo SEO como todo anda dividido al respecto, aunque la realidad es que el propio Google, ya ha dicho que se trata de una cuestión estética, y que la decisión no afecta al comportamiento del robot con nuestra web.
Lo que si es cierto, es que elijamos una u otra forma, al obligar mediante .htaccess el uso de nuestra elección, evitaremos el uso de resultados duplicados en los motores de búsqueda, con su correspondiente penalización
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
En la primera linea desactivamos la condición para el protocolo https. En la segunda linea, creamos una condición para saber la parte del dominio denominada host (FDQN más apropiado) o una dirección IP. La parte final de esa linea, comprueba si al host tiene o no www delante. Si lo tiene la regla se ignora, ya que no cumpliría la condición.
La bandera NC al final de la linea, es para ignorar el caso (mayúsculas o minúsculas)
La última linea en caso de cumplirse la primera condición es la que generara nuestra nueva URL. La bandera L indica que es la última regla del conjunto, y que cualquier otra norma o condición no será tomada en cuenta.
Como norma general, los servidores web de las empresas de alojamiento web, configuran el servicio para que el servidor dominio.com funcione de la misma forma con www o sin www. Esto produce que los usuarios según sus preferencias accedan con o sin www, y si hace un link a nuestras páginas lo hagan de la misma forma por lo que se puede producir un contenido duplicado en los buscadores, que puede ser sancionado.
Los que preferimos usar el dominio sin las www usaremos:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.domain.com$ [NC]
RewriteRule ^(.*)$ http://domain.com/$1 [R=301,L]
Esto es útil en muchos casos, y fuente de controversia (como no con estas cosas parece que siempre los SEO y los blogers no nos ponemos de acuerdo).
Podemos encontrar artículos a favor del uso de HTTPS, que comenzaron a surgir tras el artículo HTTPS as a ranking signal así como otros, como SEO, HTTPS y la desinformación
En algunos casos, como el nuestro consideramos que al tener operaciones de comercio electrónico, acceso a área de clientes o usuarios de nuestra intranet o foros, simplemente por seguridad y apariencia de la misma ante nuestros usuarios, merece la pena no sólo el uso de HTTPS, sino el uso de un certificado EV BussinesIS GreenBar.
RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Otro ejemplo para forzar sin www pero con https o con otro estilo de programación del .htaccess
RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} !^dominio\.tld$ [NC]
RewriteRule ^(.*) https://dominio.tld/$1 [L,R=301]
Para denegar el acceso al fichero .htaccess (lo cual es muy importante)
order allow,deny
deny from all
Uno de los mejores sistemas para ahorrar tráfico y aumentar la velocidad de carga de las páginas de nuestro website, es habilitar el almacenamiento en el cache de los navegadores. La gran mayoría de los usuarios tienen un sistema de cache en su navegador, que permite la verificación de las etiquetas de los archivos ya descargados con el servidor, y su almacenamiento en la cache local, lo que hace innecesario su descargar mientras el tiempo de vida no halla finalizado.
# 1 Hour = 3600
# 1 Day = 43200
# 1 Week = 604800
# 1 Month = 2592000
# 1 Year = 29030400
Header set Cache-Control "max-age=2592000, public"
Un ejemplo más extendido y que en nuestro caso va bastante bien, siempre que el módulo expires este habilitado en el servidor Apache, es el siguiente:
ExpiresActive on
## Tiempo por defecto
ExpiresDefault "access plus 1 month"
## cache.appcache para firefox 3.6
ExpiresByType text/cache-manifest "access plus 0 seconds"
## Tiempo para ficheros html
ExpiresByType text/html "access plus 0 seconds"
## Tiempo para ficheros da datos
ExpiresByType text/xml "access plus 0 seconds"
ExpiresByType application/xml "access plus 0 seconds"
ExpiresByType application/json "access plus 0 seconds"
## rss feed
ExpiresByType application/rss+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 font/truetype "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 week"
ExpiresByType application/javascript "access plus 1 week"
ExpiresByType text/javascript "access plus 1 week"
Header append Cache-Control "public"
Algunas veces nos visitan indeseables bots, y algunos usuarios con recolectores de web. La gran mayoría de los usuarios que realizan estas prácticas no saben ocultarse, y podemos crear una regla para evitar este trafico indeseable.
Por razones de tamaño, y de mantenimiento solo mostramos una porción de la lista, pero hay en GitHub donde se mantiene bad-bot-blocker
Options All -Indexes
RewriteEngine on
# Block Bad Bots & Scrapers
SetEnvIfNoCase User-Agent "Aboundex" bad_bot
SetEnvIfNoCase User-Agent "80legs" bad_bot
SetEnvIfNoCase User-Agent "360Spider" bad_bot
...
...
SetEnvIfNoCase User-Agent "^Zyborg" bad_bot
# Vulnerability Scanners
SetEnvIfNoCase User-Agent "Acunetix" bad_bot
SetEnvIfNoCase User-Agent "FHscan" bad_bot
# Aggressive Chinese Search Engine
SetEnvIfNoCase User-Agent "Baiduspider" bad_bot
# Aggressive Russian Search Engine
SetEnvIfNoCase User-Agent "Yandex" bad_bot
Order Allow,Deny
Allow from all
# Cyveillance
deny from 38.100.19.8/29
deny from 38.100.21.0/24
deny from 38.100.41.64/26
deny from 38.105.71.0/25
deny from 38.105.83.0/27
deny from 38.112.21.140/30
deny from 38.118.42.32/29
deny from 65.213.208.128/27
deny from 65.222.176.96/27
deny from 65.222.185.72/29
Deny from env=bad_bot
Una práctica común, para algunos webmasters es el utilizar las capacidades del sistema de URL, para usar en sus sitios, imágenes o ficheros almacenados en otras páginas web, sin utilizar su trafico sino el de otros.
Para evitarlo, podemos escribir en nuestro .htaccess una protección hotlinking, e incluso redirigir esas peticiones a una imagen nuestra (así nos hacen publicidad)
RewriteCond %{HTTP_REFERER} ^http://(.+\.)?myspace\.com/ [NC,OR]
RewriteCond %{HTTP_REFERER} ^http://(.+\.)?blogspot\.com/ [NC,OR]
RewriteCond %{HTTP_REFERER} ^http://(.+\.)?livejournal\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} ^https?://([^/]+)/ [NC]
RewriteCond %1#%{HTTP_HOST} !^(.+)#\1$
RewriteRule \.(jpe?g|gif|bmp|png|zip|rar)$ - [NC,F,L]
#Podemos descomentar la linea de abajo siguiremos mostrar una imagen nuestra
#RewriteRule .*\.(jpe?g|gif|bmp|png|zip|rar)$ http://dominio.tld/qX4w7.gif [L]
Hay mil apuntes más, hay muchas formas de escribir el código en el fichero .htaccess y es casi imposible abarcar todos los escenarios posibles, y las mezclas que de ellos se pueden dar.
En los enlaces relacionados, tienes las mejores páginas con información relevante para el uso de .htaccess en Apache.
Imagen Freepik Design by StartLine
Comparte este artículo
Comparte este articulo en
¡Hola a todos! Vamos a sumergirnos en el fascinante mundo de Mod Security y aprender…
Ya son muchos años en el sector, muchos años pasando por varios paneles de control,…
La lista UCEPROTECT es una herramienta utilizada por muchos administradores de sistemas y proveedores de…
No es la primera vez que me encuentro con el agotamiento de la memoria en…
Descubre cómo solucionar problemas de acceso a servidores con Centos 7, Almalinux 8, Ubuntu 20.04…
Uno de los mensajes más alarmantes que puedes encontrarte es aquel que indica que tu…
Ver comentarios
Encontré un artículo bastante apropiado, sobre todo para aclarar conceptos,ahora que con le tema Google y el HTTPS/SSL, las empresas se han lanzado a vender más humo del que ya venden de por si. SEO, HTTPS y la desinformación