10 Trucos del .htaccess

El archivo .htaccess es un documento oculto que se encuentra en los directorios en los que se desea que se ejecuten una serie de directrices del Servidor antes de ejecutar las peticiones PHP.

Usos del .htaccess

– Redirecciones
– Permisos en carpetas
– Bloquear usuarios a través de IP
– Obligar el uso o la ausencia del www.
– Interpretar URLs amigables que lean URLs dinámicas
– Interpretar extensiones (como xml o txt) para que lean archivos php
– Crear un mensaje de Error personalizado
– etc

A continuación te presentaré 5 Trucos del archivo .htaccess que yo utilizo para Cherada.com y que me garantiza estar bien optimizado y que Google me considere amigable y simpático.

Antes que nada

Para crear un documento htaccess lo que tienes que hacer es abrir una nueva hoja txt del block de notas y a la hora de guardarla darle el hombre de .htaccess, muy importante el . (punto), porque reemplaza la extension .txt

Los trucos que te daré a continuación van en el root de la cuenta, es decir, justo en el /public_html/

Lo primero es escribir estas directrices al inicio del archivo:

#### START REDIRECCIONES #####
Options +FollowSymLinks
RewriteEngine on

Con ello activamos las reglas de sobreescritura, redirección y tal.

1. Obligar el uso del www.

Existe debate respecto a este punto. Algunos dicen que es mejor con el www. otros dicen que sin, ahí gusto al cliente. Lo que yo te puedo decir, en base a mi experiencia, es que el común de los mortales relaciona el Internet con el uso del www. y el .com, si saben que tu sitio se llama «elmanguito.com» intentarán escribir www.elmanguito.com.

Como webmaster, lo que debes tener muy claro, es que Google te exije uno u otra variación, pero no las dos ya que serían interpretados como dos sitios distintos que a la larga te provocarían un gran dolor de cabeza.

Exigir el uso del www:

##### sin-www a www #####
RewriteCond %{HTTP_HOST} ^cherada.com [NC]
RewriteRule ^(.*)$ http://www.cherada.com/$1 [L,R=301]

Por cierto el # numeral es para hacer comentarios, cuandoquiera que una linea comienza con # esa linea no es directriz sino comentario.

Esa regla indica que si alguien escribe cherada.com o cherada.com/clasicados.html serán redireccionados instantaneamente a www.cherada.com y www.cherada.com/clasificados.html. El R=301 significa que es una redirección de caracter permanente.

2. Lectura de URLs amigables por sus respectivas rutas dinámicas

Para esto ya tendrías que haber logrado en base a PHP la creación adecuada de las URLs amigables (clic: Leer más al respecto). Asumiendo eso ahora nos corresponde ejecutar en htaccess la segunda parte del proceso: lograr que esas URLs amigables sean leídas a través de sus respectivas URLs dinámicas.

Una URL amigable luce así:

http://www.cherada.com/info/do/contact.html

Y su respectiva URL dinámica luciría de esta manera:

http://www.cherada.com/?seccion=info&do=contact

Nótese que «seccion» no aparece en la URL amigable, esto lo he hecho deliberadamente ya que todas las URLs de cherada surgen a traves de un seccion= así que me puedo ahorrar ese espacio (que lo puedo ocupar para alguna otra variable).

htaccess permite leer hasta un máximo de 9 variables (o carpetas) en la URL amigable, es decir algo como esto: http://www.cherada.com/1/2/3/4/5/6/7/8/9.html

Las rutinas htaccess las escribo desde la posibilidad más amplia posible hasta la más reducida dando como resultado esto:

#### CASOS GENERALES de URLs amigables ####
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+).html$ /index.php?seccion=$1&$2=$3&$4=$5&$6=$7&$8=$9 [L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+).html$ /index.php?seccion=$1&$2=$3&$4=$5&$6=$7&$8= [L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+).html$ /index.php?seccion=$1&$2=$3&$4=$5&$6=$7 [L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+).html$ /index.php?seccion=$1&$2=$3&$4=$5&$6= [L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/([^/]+).html$ /index.php?seccion=$1&$2=$3&$4=$5 [L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+).html$ /index.php?seccion=$1&$2=$3&$4= [L]
RewriteRule ^([^/]+)/([^/]+)/([^/]+).html$ /index.php?seccion=$1&$2=$3 [L]
RewriteRule ^([^/]+)/([^/]+).html$ /index.php?seccion=$1&$2= [L]
RewriteRule ^([^/]+).html$ /index.php?seccion=$1 [L]

Interpretación: el primer paréntesis ([^/]+) correspondería a la seccion que quiero ubicar. A partir de ahí van parejas de paréntesis /([^/]+)/([^/]+) que corresponderían en PHP a &variableX=valorX y así sucesivamente. Ojo con la [L], no estamos redireccionando, simplemente dando lectura a la URL dinámica a partir de la amigable.

Así,

http://www.cherada.com/info/do/contact.html

Utilizaría la antepenúltima linea:

RewriteRule ^([^/]+)/([^/]+)/([^/]+).html$ /index.php?seccion=$1&$2=$3 [L]

Dando como resultado:

^info/do/contact.html -> /index.php?seccion=info&do=contact

3. Redireccionar las antiguas URLs dinámicas a las nuevas amigables de forma permanente

Si antes utilizabas únicamente URLs dinámicas y has decidido cambiar a URLs amigables, es necesario hacérselo saber a los buscadores. Tendrás pues que establecer en el htaccess que TODAS las antiguas URLs dinamicas te las redireccione permanentemente a sus respectivas amigables.

Cuando usás el Google Webmasters, una herramienta para controlar la optimización y crecimiento de tu Sitio, te irás dando cuenta del progreso con el que Google elimina poco a poco tus antiguas URLs. Eso es a través de un trabajo conjunto con el otro archivo obligatorio que debes tener en el root de tu sitio, me refiero a robots.txt (leer más al respecto). Básicamente en el robots.txt le decís a Google (y a todos los buscadores), qué archivos puede indexar, qué carpetas obviar, qué extensiones no considerar, hasta dónde puede leer y si puede o no leer URLs dinámicas. Obviamente si estamos haciendo todo esto de cambiar a URLs amigables le diremos a los buscadores que ya no indexen URLs dinámicas, osea que después del signo de interrogación «?» ya no indexen nada.

Acá está cómo hacerlo (nuevamente desde el caso más amplio al más reducido):

#### REDIRECTS PERMANENTES GENERALES ####
#RewriteCond %{THE_REQUEST} ^[A-Z]{3,9} /?seccion=([^&]+)&([^=]+)=([^&]+)&([^=]+)=([^&]+)&([^=]+)=([^&]+)&([^=]+)=([^&]+) HTTP/
#RewriteRule ^$ http://www.cherada.com/%1/%2/%3/%4/%5/%6/%7/%8/%9.html? [R=301,L]
#RewriteCond %{THE_REQUEST} ^[A-Z]{3,9} /?seccion=([^&]+)&([^=]+)=([^&]+)&([^=]+)=([^&]+)&([^=]+)=([^&]+)&([^=]+) HTTP/
#RewriteRule ^$ http://www.cherada.com/%1/%2/%3/%4/%5/%6/%7/%8.html? [R=301,L]
#RewriteCond %{THE_REQUEST} ^[A-Z]{3,9} /?seccion=([^&]+)&([^=]+)=([^&]+)&([^=]+)=([^&]+)&([^=]+)=([^&]+) HTTP/
#RewriteRule ^$ http://www.cherada.com/%1/%2/%3/%4/%5/%6/%7.html? [R=301,L]
#RewriteCond %{THE_REQUEST} ^[A-Z]{3,9} /?seccion=([^&]+)&([^=]+)=([^&]+)&([^=]+)=([^&]+)&([^=]+) HTTP/
#RewriteRule ^$ http://www.cherada.com/%1/%2/%3/%4/%5/%6.html? [R=301,L]
#RewriteCond %{THE_REQUEST} ^[A-Z]{3,9} /?seccion=([^&]+)&([^=]+)=([^&]+)&([^=]+)=([^&]+) HTTP/
#RewriteRule ^$ http://www.cherada.com/%1/%2/%3/%4/%5.html? [R=301,L]
#RewriteCond %{THE_REQUEST} ^[A-Z]{3,9} /?seccion=([^&]+)&([^=]+)=([^&]+)&([^=]+) HTTP/
#RewriteRule ^$ http://www.cherada.com/%1/%2/%3/%4.html? [R=301,L]
#RewriteCond %{THE_REQUEST} ^[A-Z]{3,9} /?seccion=([^&]+)&([^=]+)=([^&]+) HTTP/
#RewriteRule ^$ http://www.cherada.com/%1/%2/%3.html? [R=301,L]
#RewriteCond %{THE_REQUEST} ^[A-Z]{3,9} /?seccion=([^&]+)&([^=]+) HTTP/
#RewriteRule ^$ http://www.cherada.com/%1/%2.html? [R=301,L]
#RewriteCond %{THE_REQUEST} ^[A-Z]{3,9} /?seccion=([^&]+) HTTP/
#RewriteRule ^$ http://www.cherada.com/%1.html? [R=301,L]

Observa cómo ahora hacemos la operación inversa. La que antes era una URL http://www.cherada.com/?seccion=info&do=contact ahora será http://www.cherada.com/info/do/contact.html. Por otro lado, cuando Google se entere, sabrá que por el R=301, le estamos diciendo que se olvide para siempre de la URL dinámica y, en este caso, sí redireccionará automáticamente a la amigable.

4. Casos particulares de Redireccionamiento

¿Qué crees que es más óptimo en términos de optimización? Tener una URL como esta: http://www.cherada.com/blogs/do/view/id/3855.html ó una como ésta: http://www.cherada.com/articulos/htaccess-tutorial-seo-5-trucos-para-optimizar-tu-sitio-para-google

Evidentemente la segunda forma es la más óptima. En general estos son los factores que hacen que un artículo sea óptimo para Google:

1. Que tenga un buen título
2. Que el Tag del Head coincida con el título del artículo
3. Que los tags constituyan palabras clave para el META keywords
4. Que el META description coincida con el texto del artículo
5. Que la URL sea parecida al título (además de ser amigable)

Por ahí hay otros trucos más como contar con un sitemap.xml para Google, tener un Feed RSS con los articulos actualizados a tiempo real, un Ping frecuente a los buscadores, y resaltar con negritas las palabras más importantes del artículo.

Hay ciertos trucos que expliqué de los elementos que debe tener la Tabla de Artículos en la Base de Datos de tu Sitio. Veíamos que es necesario que además de un ID tengamos también un campo único para cada fila de article_key. El objetivo de este key es que lleve el nombre del artículo pero omitiendo caracteres especiales, tildes, ñs, etc… osea, el título crudo y pelado optimizado para URL. En el caso de este artículo el key sería: htaccess-tutorial-seo-5-trucos-para-optimizar-tu-sitio-para-google

Existe debate entre qué es mejor si el uso de guion (-) o guion bajo (_) a la hora de generar la URL. A mi me ha servido de maravilla el guion.

Bien, ya con mis keys en la base de datos seré capaz de crear reglas específicas de lectura para URLs super amigables para los artículos:

##### BLOG #####
# articulos/titulo-del-blog/6/#comment-138496
RewriteRule ^articulos/([^/]+)/([^/]+)/(.*)$ /index.php?seccion=blogs&do=view&name=$1&p=$2$3 [L]
# articulos/titulo-del-blog/#comment-138496
RewriteRule ^articulos/([^/]+)/(.*)$ /index.php?seccion=blogs&do=view&name=$1$2 [L]
# articulos/titulo-del-blog
RewriteRule ^articulos/([^/]+)$ /index.php?seccion=blogs&do=view&name=$1 [L]

Lo importante que debes observar es la última regla, que ^articulos/([^/]+)$ te lo lea como ?seccion=blog&do=view&name=$1. En este caso yo le diré a mi archivo PHP que, en lugar de leer las variables del artículo a través del ID, lo haga por medio del article_key, osea desde el $_GET(«name»). Las dos reglas que puse encima son previendo si en un futuro el artículo tendrá paginador de comentarios y si llegan al artículo a través de un comentario específico.

Muy importante: Estas reglas especiales deben ir ANTES de las reglas generales en nuestro archivo htaccess. Esto es así porque htaccess lee las líneas en orden y si ya ejecutó una petición particular se detendrá ahí y ya no leerá el resto.

5. Leer archivos .xml y .txt a partir de archivos PHP

Existen formas dinámicas de generar archivos RSS, de sitemap.xml, de urllists.txt a partir de PHP. (Leer instrucciones aquí). Una vez creados, debes decirle al htaccess que te lea esas extensiones a partir de los archivos php que te generan el contenido dinámico.

#### XML Y ROBOTS ####
RewriteRule sitemap.xml(.*) sitemap.php$2 [nocase]
RewriteRule index.xml(.*) rss.php$2 [nocase]
RewriteRule urllist.txt(.*) urllist.php$2 [nocase]

Tips adicionales de Optimización

Gracias al Google Webmasters puedes crear un código HTML que te servirá para tener un archivo 404.php adecuado para mostrar una página de Error No Encontrado.

Acá la redirección que tendrás que tener:

#### ERROR #####
ErrorDocument 404 /404.php

Deja una respuesta