url-optimalisatie-voor-zoekmachines
Gesponsorde koppelingen
PHP script bestanden
URL optimalisatie voor zoekmachines
Een (belangrijk) onderdeel van het optimaliseren van je website voor zoekmachines is het gebruiken van zoekmachine vriendelijke URLs.
Merk op: Deze code is geschreven voor websites die vanuit 1 index pagina wordt opgebouw (wat bij websites die via een CMS beheerd moeten worden doorgaans het geval is). Indien jou website niet zo wordt opgebouwd moet je goed kijken in hoeverre deze code bruikbaar is voor jou. Maar het is (denk ik) in ieder geval interessant om kennis van te nemen.
Een url als index.php?page=zoeken&view=resultaten&keyword=belangrijk_keyword wordt gezien als zoekmachine onvriendelijk. De parameters in de URL worden door de meeste zoekmachine-crawlers genegeerd, terwijl de URL juist een belangrijk punt is voor waardering van je site.
Ik wil daarom de URLs zo goed mogelijk inrichten zodat deze optimaal ‘presteerd’ in de zoekmachine. We gaan er hierbij van uit dat hoe verder woorden naar links staan in de url, hoe belangrijker dit woord vormt voor de zoekmachine indexering (een stelling die doorgaans juist blijkt te zijn).
De opbouw van de niet geoptimaliseerde URL gaan we dan ook ombouwen naar:
http://www.domeinnaam.tld/insert-important-keywords-here/page/key1/value/key2/value/key3/value/..
Belangrijk om te weten is dat het blokje ‘belangrijkste-keywords’ totaal niet wordt gebruikt bij het laden van de website. Het is puur opgenomen voor het optimaliseren van de URL, net als dat je metatags opneemt in je pagina neem ik een dergelijk label op in de URL.
Het script let standaard op 4 keys in de URL:
&label=…
Deze key bevat het label met de belangrijkste keywords van de pagina, opgenomen in de URL voor puur en alleen zoekmachine optimalisatie
&page=…
Het pagina ID, waarmee het script kan bepalen welke pagina deze moet laden.
&view=…
Wanneer een pagina (module?) bestaat uit verschillende views, kunnen deze hier worden opgenomen. Dit veld wordt tevens als label gebruikt als er geen label aanwezig is (doorgaans de gewenste opvolger om als label te fungeren)
&file=…
Als je bestanden wil laten parsen via een php-file, zodat het mogelijk wordt bezoekersrechten e.d. te bepalen voor de bestanden, kun je bij &file= een bestandsnaam opgeven. Deze key wordt, als deze bestaat, altijd achteraan geplaatst zodat de URL altijd eindigd met deze bestandsnaam.
Reden hiertoe is dat sommige versies van IE een cache probleem hebben als je afbeeldingen laad vanuit een url die op het oog geen geldige bestandsnaam is. Maar dit valt een beetje buiten de scope van de gemiddelde gebruiker van dit script denk ik dus daar zal ik me verder niet ovcer uitwijden.
Alle overige keys worden op dezelde volgorde als dat ze in de niet-geoptimaliseerde URL zitten opgenomen in de wel-geoptimaliseerde URL.
Een paar voorbeelden:
2
3
4
5
6
7
8
9
10
11
Was: index.php?page=zoeken&view=resultaten&keyword=fiets&lable=important-keywords
Wordt: http://www.domeinnaam.tld/important-keywords/zoeken/view/resultaten/keyword/fiets
Zonder label, met view (view wordt tevens als label gebruikt)
Was: index.php?page=zoeken&view=resultaten&keyword=fiets
Wordt: http://www.domeinnaam.tld/resultaten/zoeken/view/resultaten/keyword/fiets
Zonder label en view (geen extra optimalisatie)
Was: index.php?page=zoeken&keyword=fiets
Wordt: http://www.domeinnaam.tld/~/zoeken/keyword/fiets
Het parsen van niet geoptimaliseerde URLs naar wél geoptimaliseerde kan via onderstaande functie.
Geef bij het aanroepen van de functie de te vertalen URL op, en de root van je website waar de index.php staat.
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
function optimizeUrl($sUrl, $sDomainRoot = false)
{
$sResult = '';
$aArguments = array();
// Strip domain path
if($sDomainRoot)
{
$sResult = $sDomainRoot;
if(strcasecmp(substr($sUrl, 0, strlen($sDomainRoot)), $sDomainRoot) === 0)
{
$sUrl = substr($sUrl, strlen($sDomainRoot)); // Slice domainpath
}
}
// Strip 'index.php?'
$sUrl = substr($sUrl, strlen("index.php?"));
// Get each key/val pair
$args = explode("&", $sUrl);
for($i = 0; $i < sizeof($args); $i++)
{
$arg = explode("=", $args[$i]);
$key = strtolower(trim($arg[0]));
$val = '';
if(sizeof($arg) > 0)
{
$val = trim(urldecode($arg[1]));
}
$aArguments[$key] = $val;
}
if(array_key_exists("lable", $aArguments) && (strcasecmp($aArguments["lable"], "") !== 0))
{
$sResult .= urlencode($aArguments["lable"]) . '/';
}
else
{
if(array_key_exists("view", $aArguments) && (strcasecmp($aArguments["view"], "") !== 0)) // See if VIEW was used
{
$sResult .= urlencode($aArguments["view"]) . '/';
}
else
{
$sResult .= '~/';
}
}
if(array_key_exists("page", $aArguments) && (strcasecmp($aArguments["page"], "") !== 0))
{
$sResult .= urlencode($aArguments["page"]) . '/';
}
else
{
$sResult .= '0/';
}
foreach($aArguments AS $key => $val)
{
if((strcasecmp($key, "lable") !== 0) && (strcasecmp($key, "page") !== 0) && (strcasecmp($key, "file") !== 0))
{
$sResult .= urlencode($key) . '/' . urlencode($val) . '/';
}
}
if(array_key_exists("file", $aArguments) && (strcasecmp($aArguments["file"], "") !== 0))
{
$sResult .= 'file/' . urlencode($aArguments["file"]);
}
return $sResult;
}
?>
Voorbeeld van gebruik:
2
3
optimizeUrl("index.php?page=zoeken&view=resultaten&keyword=fiets&lable=important-keywords", "http://www.domeinnaam.tld/");
?>
Om een geoptimaliseerde URL terug te kunnen vertalen naar de werkelijke URL, kun je onderstaande functie gebruiken, i.c.m. een .HTACCESS file.
Deze functie overschrijft de $_GET array met de waarden uit de geoptimaliseerde URL. Roep deze functie bovenin je index file aan, zodat alle volgende code de juiste waarden in de $_GET array kan gebruiken.
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function translateUrl()
{
if(array_key_exists("REDIRECT_URL", $_SERVER) && (strcasecmp($_SERVER["REDIRECT_URL"], "") !== 0)) // See if htaccess detected an optimized url
{
$sPath = substr($_SERVER["SCRIPT_NAME"], 0, strlen($_SERVER["SCRIPT_NAME"]) - strlen("index.php"));
$sRequest = substr($_SERVER["REDIRECT_URL"], strlen($sPath));
$args = explode('/', $sRequest);
// Overwrite arguments
for($i = 2; $i < sizeof($args); $i += 2)
{
if((strcasecmp($args[$i], "~") !== 0) && (strcasecmp($args[$i], "") !== 0))
{
$key = urldecode($args[$i]);
$_GET[$key] = ((strcasecmp($args[$i + 1], "~") === 0) ? '' : urldecode($args[$i + 1]));
}
}
// Get lable
$_GET["lable"] = ((strcasecmp($args[0], "~") === 0) ? '' : urldecode($args[0]));
// Get page
$_GET["page"] = ((strcasecmp($args[1], "~") === 0) ? '0' : urldecode($args[1]));
ksort($_GET);
}
}
?>
.HTACCESS file:
(plaats deze .htaccess file in dezelfde map waar je index.php staat).
2
3
4
5
6
7
8
9
10
RewriteEngine On
# Catch blocked folders (treat as optimized urls)
RewriteRule ^(folder1|folder2|folder3)(/(.*)?)?$ index.php [NC,L]
# Catch non existing files and/or folders (treat as optimized urls)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [NC,L]
Voordeel van deze methode is dat zowel geoptimaliseerde als niet geoptimaliseerde URLs blijven werken.
Voor mensen die in de luxe positie zitten dan hun website eerst alle HTML-content inlaad in een variabele en pas als deze klaar is alles in 1x output, heb ik het volgende script. Deze spoort alle niet-geoptimaliseerde URLs op in de content en vervangt ze voor wél geoptimaliseerde URLs.
Merk op dat deze functie gebruik maakt van de functie optimizeUrl(<args>) die hierboven vermeld staat.
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// Tools to uptimize URL's
function optimizeUrls($sContent, $sDomainRoot = false)
{
$matches = array();
if($sDomainRoot)
{
$expr = '/(?:"' . escapeRegex($sDomainRoot) . 'index\.php(?:[^"]*)")|(?:\'' . escapeRegex($sDomainRoot) . 'index\.php(?:[^\']*)\')|(?:\'index\.php(?:[^\']*)\')|(?:"index\.php(?:[^"]*)")/';
}
else
{
$expr = '/(?:\'index\.php(?:[^\']*)\')|(?:"index\.php(?:[^"]*)")/';
}
preg_match_all($expr, $sContent, $matches);
for($i = 0; $i < sizeof($matches[0]); $i++)
{
$sQuote = substr($matches[0][$i], 0, 1);
$sOldUrl = substr($matches[0][$i], 1, -1);
$sNewUrl = optimizeUrl($sOldUrl, $sDomainRoot);
// echo '<b>' . $sOldUrl . '</b><br>' . $sNewUrl . '<br><br><br>';
$sContent = str_replace(($sQuote . $sOldUrl . $sQuote), ($sQuote . $sNewUrl . $sQuote), $sContent);
}
return $sContent;
}
?>
Voorbeeld van gebruik:
2
3
optimizeUrls("html content met veel niet geoptimaliseerde urls", "http://www.domeinnaam.tld/");
?>
Succes! (: