martes, 28 de enero de 2014

Tutorial .htacess para Prestashop



Sé que existen miles de tutoriales sobre htaccess, en todos los idiomas y con un millón de ejemplos. A veces he tenido que leer 10 o 15 tutoriales para encontrar la forma de solucionar el problema y la verdad es que uno se desespera, esa abrumadora cantidad de información es la que me ha empujado a realizar este tutorial centrado a solucionar los problemas que pueden surgir en Prestashop.

Sin duda una parte fundamental para cuidar y mejorar nuestra tienda online es dominar un poco el .htaccess, ese archivo que nos encontramos en la raíz de nuestra web, que puede parecer poca cosa, pero en realidad es como el sheriff y lleva la voz de mando en el tema de accesos de nuestra web.

El .htaccess puede hacer muchas cosas como bloquear robots maliciosos que se saltan el robots.txt, filtrar IP’s, activar la compresión de archivos del servidor, controlar el acceso a carpetas, y un montón de cosas más, pero en este tutorial nos vamos a centrar en la función de redireccionamiento o rewriterules, que es la función más utilizada y la que nos ayudará a solucionar rápidamente todos los errores 404, eliminar páginas antiguas o redireccionar esas páginas antiguas a una página actualizada.

Puede parecer un poco duro al principio pero si le pilláis el tranquillo, incluso le cogeréis cariño al htaccess y veréis cómo podréis solucionar muchas cosas, entre ellos todos los errores que aparecen en vuestro webmastertools o migraciones de urls.

Pondré un ejemplo básico y luego explicaremos el código paso a paso.

Redirección Sencilla

El siguiente ejemplo hace que la página antigua y eliminada www.mitienda.com/pagina-ant-1.html se redireccione a la página principal.

<IfModule mod_rewrite.c>

            RewriteEngine on
            RewriteCond %{HTTP_HOST} ^www.mitienda.com$            
            RewriteRule ^pagina-ant-1$ http://www.mitienda.com/ [R=301,L]

</IfModule>

Repasemos ahora el código.

<IfModule mod_rewrite.c>
Lo primero que hacemos es abrir un condicional. Comprueba si existe el módulo mod_rewite.c en el servidor y si es así comprobará el código anidado.

RewriteEngine on
Activa esta función en el servidor

RewriteCond %{HTTP_HOST} ^www.mitienda.com$
Condición a cumplirse. Si la variable del servidor %{HTTP_HOST} es igual a www.mitienda.com comprobaremos la Rewrite Rule.

NOTA:
^ - Indica el principio de la palabra a buscar
$ - Indica el final de la palabra a buscar

RewriteRule ^pagina-ant-1$ http://www.mitienda.com/ [R=301,L]
Cuando la url sea http://www.mitienda.com/pagina-ant-1 redirecciona a la página http://www.mitienda.com/

Al final del código hay unos Flags [R=301,L] esto indica a la norma de reescritura las siguientes opciones.

R=301 – R= Redirección 301 permanente. Existen varios tipos de redirecciones, pero salvo alguna excepción utilizaremos siempre la 301.
L – Al cumplirse esta norma, para el código y no ejecuta ninguna condición más.

</IfModule>
Cierra el condicional principal. Siempre que queramos añadir una nueva redirección asegurarse de colocar el código antes del cierre del IfModule.

Comodines y Variables

Adentrándonos un poco más en htaccess vamos a conocer los comodines y variables utilizadas en redirecciones, son tremendamente útiles y nos ayudarán a solucionar muchos problemas de forma sencilla.

Repasemos primero los valores más utilizados.

. – Cualquier carácter a excepción del espacio.
* El carácter anterior puede repetirse 0 o más veces.
 () – Agrupa el contenido y lo guarda en una variable $1 para que podamos utilizarla en caso de ser necesaria en la dirección de destino.
| – Se utiliza dentro de los () para separar opciones de cadenas de url, viene a ser un “OR” Ej. (pag-x|pag-y) será verdadero si la url contiene la cadena pag-x o pag-y.
\ – Código de escape, utilizaremos la barra invertida para poder utilizar el punto como texto de la cadena pag-z\.html

Como ejercicio miraremos de redireccionar la url 1 a la url 2.

1.- http://www.mitienda.com/categoria-antigua/3487-producto.html
2.- http://www.mitienda.com/categoria-nueva/3487-producto.html

<IfModule mod_rewrite.c>

            RewriteEngine on
            RewriteCond %{HTTP_HOST} ^www.mitienda.com$            
            RewriteRule ^categoria-antigua/(.*)$ http://www.mitienda.com/categoria-nueva/$1 [R=301,L]

</IfModule>

Teniendo en cuenta el ejemplo anterior únicamente explicaremos los nuevos elementos.
Lo significativo de este código es el ^categoria-antigua/(.*)$ esto indica que si la url solicitada contiene categoría-antigua/(y lo que sea) lo enviará a categoría-nueva/(y lo que sea).

Supongo que el concepto ha quedado claro ¿no?

Otro ejemplo.

Tengo varias categorías antiguas y he terminado agrupándolas en una

<IfModule mod_rewrite.c>

            RewriteEngine on
            RewriteCond %{HTTP_HOST} ^www.mitienda.com$            
            RewriteRule ^(categoria-antigua-1|categoria-antigua-2|categoria-antigua-3)/(.*)$ http://www.mitienda.com/categoria-nueva/$2 [R=301,L]

</IfModule>

En este ejemplo hemos creado un grupo que redirecciona cualquier url que contenga esa categoría antigua y en el segundo grupo anida cualquier contenido.

Fijaros que ahora en la url de salida ya no pone $1 que sería el contenido del primer grupo de () dando un resultado erróneo como: http://www.mitienda.com/categoria-nueva/categoria-antigua-x

Utilizando $2 devolverá el contenido del segundo grupo de (.*) que ya sabemos que será un lo que sea.

URL’s Con consultas

De forma menos habitual podemos encontrarnos errores de urls con consultas, que serán todas las direcciones que Prestashop por ahora no las convierte en amigables como al paginar en el listado de productos. Para explicarme mejor pondré un Ejemplo.

Imaginemos un error en Webmastertools de Google que indica la siguiente url, nuestra misión es redireccionarla a la homme.

http://www.mitienda.com/mi-categoria?p=2

Estas no se pueden solucionar como lo hemos hecho antes, y lo que tenemos que hacer es añadir un nuevo RewriteCond que contemple la variable del servidor QUERY_STRING

El carácter “?” es un carácter reservado con lo que la opción rápida de poner la url entera en el rewrite rule es viable, además de que una url con consulta no es una url clásica ya que la cadena de la consulta se almacena en la variable del servidor %{QUERY_STRING}.


<IfModule mod_rewrite.c>

RewriteCond %{HTTP_HOST} ^www.garamo.com$
RewriteCond %{QUERY_STRING} ^p =(2|3|4)$
RewriteRule ^(categoria-antigua-1|categoria-antigua-2)$ http://www.mitienda.com? [R=301,L]

</IfModule>

Que hay que tener en cuenta en el ejemplo.

Recordemos la url de ejemplo: http://www.mitienda.com/mi-categoria?p=2

RewriteCond %{QUERY_STRING} ^p =(2|3|4)$
De igual forma que con la variable del host, La variable QUERY_STRING guarda el contenido de cualquier consulta en url, lo que va después del ?. Comprobamos que la consulta contenga “p=2”, o “p=3”, o “p=4”

RewriteRule ^(categoria-antigua-1|categoria-antigua-2)$ http://www.mitienda.com? [R=301,L]
En esta sección del código vemos filtramos que la condición de reescritura se realizará si la url contiene “categoría-antigua-1” o “categoría-antigua-2”.

Si en la url tenemos alguna de estas 2 categorías y además incorpora la consulta del RewriteCond entonces realizará la redirección a http://www.mitienda.com

NOTA: Finalizar la URL con el símbolo “?” evita que la consulta original se sume a la url final.

Creo que hasta aquí podemos entender lo básico para crear cualquier redirección de nuestra web.

En un próximo post pondremos ejemplos concretos y útiles de redireccionamiento con Prestashop.

Si tenéis alguna duda o una redirección que necesitáis y no os sale, comentarlo en el post y le daremos solución.