
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.netMés informació: Manual mod_rewrite Tutorial molt explicatiu mod_rewrite cheat sheet Optimizing your MovableType blog for Google
No hay comentarios:
Publicar un comentario