1

Apache .htaccess y rewrite

Apache htaccess wrrite

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.

Guia de uso de .htaccess para reescritura de redirecciones

Ejemplos de .htaccess para webmasters y hosting.

Motor de reescritura

Para que las reglas de htaccess funcionen, lo primero es que el motor de reescritura (rewrite) debe estar encendido

Options -Indexes +FollowSymLinks
RewriteEngine On
Restricciones hosting
Options -Indexes +FollowSymLinks deberá estar activado en el servidor. Algunas empresas de alojamiento de páginas web, ponen restricciones al uso de .htaccess para alguno planes de alojamiento. Si ya estuviera activado esa linea no afectará al funcionamiento de su .htaccess
La opción -Indexes es importante, pues en algunos casos esta desactivada, lo que hace que Apache muestre el contenido de aquellas carpetas que no disponen de un fichero indice, lo cual en muchos casos no es lo deseado. Si en una caso concreto quisiéramos mostrar el contenido, simplemente deberíamos indicarlo en el .htaccess de ese directorio con Options +Indexes

Redirección básica

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.

  • ^ Es una expresión regular, que indica el comienzo de la petición.
  • $ Es una expresión regular, que indica que la petición debe terminar con esto.
Info
Hablaremos más adelante sobre banderas y expresiones regulares

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.

HTML a PHP

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

Eliminar las extensiones de archivo

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/

GoDaddy
Los usuarios de GoDaddy (por ejemplo) y de otros hosting en los que esta activado el Multiviews deberán desactivarlo añadiendo al principio del fichero .htaccess la linea:
Options -MultiViews

Añadir www al dominio

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.

Quitar las www del dominio

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]

Forzar HTTP a HTTPS

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]

Denegar el acceso a .htaccess

Para denegar el acceso al fichero .htaccess (lo cual es muy importante)

 
   order allow,deny
   deny from all

Habilitar el almacenamiento en caché

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
 
<FilesMatch "\.(flv|gif|jpg|jpeg|png|ico|swf|js|css)$">
    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"

Parar bots indeseables

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 &amp; 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

Evitar el hotlinking o el uso de ancho de banda

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]
Atención
No use este código para redirigir a una URL. Solo se puede reemplazar una imagen por otra.

Notas finales sobre .htaccess

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.

 


Artículos Relacionados


Imagen Freepik Design by StartLine

Comparte este artículo

Artículo Antiguo
Este artículo tiene más de 2 años. Es muy probable que su contenido este anticuado, aunque pueda ser de utilidad, es conveniente que revises otras informaciones al respecto. Si lo encuentras útil o crees que puede ser actualizado, deja tu comentario con la actualización para poder editarlo y que pueda ser útil a los demás.

Comparte este articulo en

Comments 1

  1. Post
    Author

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *