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
$ - 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.
* – 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.
No hay comentarios:
Publicar un comentario