Dynamiske URLer uden duplicate content

No Comments

Som min gode ven Marcel Fuursted skrev om, for noget tid siden, findes der på mange dynamisk genererede sider, ofte problemer med duplicate content. Problemet findes i flere CMSer, webshops og ganske sikkert en del andre systemer, som automatisk genererer en URL til en “unik” side.

Jeg vil ikke gå meget i dybden med begrebet duplicate content – det er vidst beskrevet op til flere gange – jeg vil lige forklare lidt om hvordan det kan opstå, for herefter at give et foreslag til hvor let det egenligt er, at komme ud over!

Sådan kan duplicate content opstå

Mange dynamiske sider henter deres indhold fra en database ved direkte, at lave en query med f.eks. et ID. Forestil dig URLen:

/index.php?pageID=123

index.php kunne hente og udskrive indholdet fra databasen, hvor id er 123, ved følgende simple query:

$ID = mysql_real_escape_string($_GET["pageID"]); //secure string for DB
$query = mysql_query("SELECT content FROM content WHERE id=".$ID."");
$dbObj = mysql_fetch_object($query);
echo $dbObj->content;

More

Simon-Jensen.net reloaded

1 Comment

Weeee… så fik jeg endelig det nye design i luften! Men det er nu også langt fra kun designet der er skiftet, faktisk har jeg skrevet hele “maskineriet” bag sittet om.

Du har måske lagt mærke til at der har være lidt stille her den seneste tid, hvilket langt hen af vejen grunder i arbejde med at få de mange idéer implementeret. Til sidst var jeg knap nok inde og se på mit gamle site, da jeg allerede så på det med gamle øjne. Det resulterede i et væld af spam (Tjaa, fik aldrig rigtigt mit spam-filter til at virke ordentligt), og jeg endte med at fjerne muligheden for at kommentere.

Nu er der nye tider på vej – jeg har lavet en hel del ændringer, og her kommer så en kort introduktion til det nye site.

More

mod_rewrite

2 Comments

Har du nogen sinde set URLs på formen:
www.mypage.dk/index.php?user=Simon&page=gallery
Dette er sider genereret med et dynamisk sprog som f.eks. PHP (se evt. posten "Vil du også være med? Del. II"), der unikt peger på indhold, som var det på formen:
www.mypage.dk/Simon/gallery.html

Men har du nogen sinde lavet et community, med brugerprofiler og mulighed for flere forskellige funktionaliteter, som f.eks personligt galleri, vil du vide at dette er mere eller mindre umuligt at holde styr på med HTML alene.
Alligevel kan du på f.eks. www.deviantART.com, som nok er verdens største kreative community, se URLs som:
http://user.deviantart.com/gallery/
Her skulle man igen, ved første øjekast, tro at der fantes et katelogene /User/gallery/ med en index-fil af en eller anden slags. Men med sine over 2 millioner brugere og mere end 21 millioner uploads (til dags dato), tvivler jeg meget stærkt på at dette er tilfældet!
Mere sandsynligt er det, at sider på formen /User/gallery/ er blevet mappet over på formen /?user=User&page=gallery – Og det er faktisk muligt!

Måden dette kan håndteres er ved hjælp af et såkaldt re-write modul, som er installeret på webserveren.
Da jeg selv benytter Apache´s webserver, og det er denne jeg har erfaring med, vil det blive denne jeg tager fat på.
Til Apache hedder modulet mod_rewrite, og følger med installationen som standard (til Windows i hvert fald).

mod_rewrite modulet fungerer ved at undersøge den URL der bliver sendt, og teste den op mod nogle rewrite regler.
Reglerne kan defineres i serverens konfigurations fil httpd.conf, eller hvis man ikke har adgang til denne, via en .htaccess-fil. Reglerne defineres vha. regulære udtryk, hvilket nemt kan virke som en gang hyroglyfer ved første møde.
Lad os springe ud i det. Tager vi overstående eksempel fra deviantART, vil målet her være at lave en regel, der mapper:
    /User/gallery
over i:
    /?user=User&page=gallery

Og dette kan vi gøre ved reglen:

RewriteEngine On
RewriteRule ^([a-z] )/([a-z] )/? index.php?user=$1&page=$2 [L]

Skridt for skridt:
- Først lader vi serveren vide at RewriteEngine, som er motoren bag hele modulet, skal være slået til.
- Herefter laver vi regel, der genkender URLs som består af to strenge, med et eller flere af karakterene [a-z] , efterfulgt af en eller ingen slash (/?).
- For hver streng, som er defineret meller paranteserne, substituerer vi disse over i variablen $1, $2, som er værdier for henholdvis user og page.

Og så er vi faktisk kørende. Du kan nu tilgå siden /?user=User&page=gallery med URLen /User/galley. Du skal dog være opmærksom på, at der ikke er nogen magi her, du skal selv i din kode omskrive dine URLs til at benytte den nye struktur, og blot hold for øjet, at de jo faktisk er på den mere forvirende form.

Men hvor skulle ham overhovedet ville gøre dette? Tja – hvad husker du bedst?
/?year=2006&month=May&day=22&id=21
eller
/22-May-2006/mod_rewrite.html
Og det gør søgemaskiner desuden også!

Før jeg skrev denne artikel, var jeg forbi følgende tre sider, som indeholder nogle noget mere detajlerede beskrivelser om både mod_rewrite og regulære udtryk. Er du mere interesseret, er de rigtig gode startsteder:
www.alistapart.com/articles/urls/
http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html
http://forum.modrewrite.com/