Dynamiske URLer uden duplicate content

Apr 13, 2008

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;

Ovenstående vil ofte virke som man regner med, men "/index.php?pageID=123" er langt fra den eneste URL der giver det forventede resultat. Hvad med følgende:

/index.php?pageID=123&somevar=asdf

/index.php?pageID=123&somevar=asdf&someothervar=blabla

/index.php?pageID=123&yetanother=irrelevant

Da alle ovenstående URLer har sat variablen pageID til 123, hvilket er alt hvad vores database query skal bruge, vil samtlige URLer give samme resultat! De efterfølgende variabler (somevar, someother, yetanother) er altså irrelevante, men linket kan stadig figurerer og virker altså lige så godt som den oprindelige!

Sådan kan duplicate content undgåes

Jeg har tidligere haft skrevet om mod_rewrite modulet til Apache, hvilket lader dig omskrive en URL, for herefter at parse denne til specifik fil.

Idag laver jeg ikke en PHP-løsning uden at bruge mod_rewrite, og løsningen ligger så meget op til, at man skal verificerer den indkommende URL, at duplicate content nemt bliver elimineret i processen. Det skal dog nævnes, at denne løsning også sagtens kan lade sig gøre, hvis du benytter URLer som i eksemplet ovenfor!

Jeg har til hver af mine poster et felt i databasen som indeholder den fulde URL (uden domænenavn) til hver post. I tilfældet af denne post, er værdien som du nok har gættet:

/dynamiske-urler-uden-duplicate-content.html

Når du går ind på denne URL, skal jeg for at hente indholdet, lave en query til min databasen. Da jeg ikke har en pageID variabel eller lignende, benytter jeg den fulde URL som identifyer (læs: id). Queryen kunne se ud, nogenlunde, som følgende:

$url = mysql_real_escape_string($_SERVER[REQUEST_URI]); //secure string for DB
$query = mysql_query("SELECT content FROM content WHERE url=".$url."");
$dbObj = mysql_fetch_object($query);
echo $dbObj->content;
Prøver du at tilføje ekstra variabler til denne post, vil du se, at du får en 404 fejl. Dette gøres ganske simpelt, ved lige at checke om queryen også gav noget resultat, og hvis ikke, kaste en header med en fejlkode inden der forsøges at udskrive noget:
//query goes here...
...
if(empty($dbObj)) {
    header("HTTP/1.1 404 Not Found");
    header("Status: 404 Not Found");
    exit();
} else {
    echo $dbObj->content;
}
For at den besøgende ikke bare møder en kedelig standard 404-side, kan du designe en speciel side, som du vil bruge til dette formål - tilføj følgende linie i din  .htaccess, for at henvise 404-fejl til en speciel side:
ErrorDocument 404 /404.php

Comments

comments powered by Disqus