20060814

Com fer un url rewrite per fer les URLs més "googlejables"

En teoria diuen que per fer que google t'indexi millor el text de la URL importa molt (no estic segur si es una llegenda urbana o no).

Algunes de les normes que corren sobre aquesta llegenda urbana son:

1. Fer que les urls tinguin cert sentit, cada vegada més google aposta per interpretar llenguatge natural, i no nomes keywords (es suposa que això de moment s'aplica més al angles que d'altres idiomes)
2. Evitar URLs de més de 250 caràcters, podrien ser considerades spamm per google
3. A les frases que posem a la url substituir els espais per guions "-" i no per underscores "_" ja que sembla que el google no pilla bé els underscores

Per fer això, he implementat un url rewrite (mod_rewrite) al Apache de producció, això em permetrà modificar la URL que m'arriba de manera flexible i molt potent.

El problema del mod_rewrite, es que es molt complexe, però amb alguns tutorials "per tontos" he aconseguit fer el que necessitava.


troç del mod_rewrite cheatsheet
friky foto


La meva idea es:

1. Basar-me nomes en un directori (en el meu cas /gen/) que actualment no té contingut
2. Faré servir dos "variables" a la expressió regular, una pel dia en format yyyymmdd i l'altre per l'identificador del recurs dins del CMS (Content Management System)
3. De moment només mapejaré un tipus de contingut del CMS, noticies, que es el més indexable, així simplifico la gestió.

Primer s'han d'incloure les directives genèriques del mod_rewrite:


RewriteEngine On
RewriteLog /xxx/yyy/apache2.0.55/logs/rewrite.log
RewriteLogLevel 1


Això activa el mod_rewrite (a nivell del virtual host que vulguem) i indica on deixar els logs de rewrite, atenció, es convenient baixar el LogLevel a 0 de seguida que pugem perquè genera molta merda.


# /gen///noticias/titol.html --> /lv24h//.html
# $1 es la data (yyyymmdd)
# $2 es el compid
RewriteRule ^/gen/([0-9]+)/([0-9]+)/noticias/.*\.html$ /lv24h/$1/$2.html


Aquest es el meollo del rewrite, com indiquen els comentaris la variable $1 es la data en format yyyymmdd i la variable $2 es el id únic del recurs dins del CMS

També cal notar que per seguretat forço els directoris, tant d'entrada /gen/ com de sortida /lv24h/ així no em poden fer la pirula per intentar accedir a altres directoris.

Explicació caràcter a caràcter:

^ --> indica inici d'string
/gen/ --> directori del que farem rewrite, si la url no conte /gen/ no farem res
([0-9]+) --> Els parentesis son per definir una variable ($1 i $2) i el [0-9] vol dir que acceptem caracters de tipus numeric (del 0 al 9) amb el + fem un tancament de kleene (indica que com a mínim ha d'haver un dígit i que pot haver-hi n) si volem un tancament de kleene opcional (una kleene star, que indica que pot no haver cap dígit o 1 o n) hem de fer servir * en lloc de +
/noticias/ --> un altre cop a pinyon, esperem el directori noticias
.* --> Amb un . sense escapar, estem indicant un caràcter especial de les expressions regulars, es tracta de dir qualsevol caràcter excepte el enter (\n), així doncs, si fem .* estem fent un tancament de kleene sobre qualsevol cosa, per tant "EL QUE SIGUI n-vegades"
\.html --> Esperem a pinyon l'string .html (ATENCIÓ, aquest punt s'ha d'escapar, sinó estaríem dient qualsevol cosa (com hem vist anteriorment))
$ --> Final d'string

La part dreta del rewrite es molt més simple:
/lv24h/ --> A pinyon redireccionem a /lv24h/
$1/$2 --> agafarem el valor de les dues variables que em vist abans data i compid
.html --> A pinyon esperem que el destí es digui .html

Evidentment, el fitxer destí ha d'existir, sinó el rewrite fotrà un pet com un aglà !

Exemples:
http://localhost/gen/20060814/51279679687/noticias/hola-tete-com-estas.html
http://localhost/gen/20060812/51279679687/noticias/ajdfjsdfo.html
http://localhost/gen/20060811/5127967/noticias/ajd-fj-s-dfo.html

Es traduirien per:
http://localhost/lv24h/20060814/51279679687.html
http://localhost/lv24h/20060812/51279679687.html
http://localhost/lv24h/20060811/5127967.html

Noteu que en cap cas afecta el que posem darrera de noticias, però evidentment si es algo amb sentit i que no canvia, molt millor per ser indexats al google

També noteu que es poden fer paranoies del estil, accepto una url amb dos variables i les giro, per confondre a un possible atacant, nomes caldria fer:
RewriteRule ^/gen/([0-9]+)/([0-9]+)/noticias/.*\.html$ /lv24h/$2/$1.html

Per mi no es útil, però es podria fer.

També el mod_rewrite es molt utilitzat per homogeneïtzar les url i fer-les "independents de la plataforma", per exemple si servim contingut dinàmic, avui podem estar fent servir url del estil *.jsp i demà del estil *.php, per homogeneïtzar i fer una especie de "urls lògiques", podem fer servir el mod_rewrite del Apache.

Tanco amb una frase del manual, que il·lustra molt bé la complexitat del mod_rewrite:



Despite the tons of examples and docs, mod_rewrite is voodoo. Damned cool voodoo, but still voodoo.


-- Brian Moore
bem@news.cmc.net


Més informació:
Manual mod_rewrite

Tutorial molt explicatiu

mod_rewrite cheat sheet
Optimizing your MovableType blog for Google