Startseite >> Blog-Sitemap mit PHP

Blog-Sitemap mit PHP

Rubrik: PHP, zu den Kommentaren

Was ist eine Sitemap?

Eine Sitemap ist eine XML-Datei, die alle erreichbaren Links einer Webseite, also z.B. eines Blogs, enthält. Die Sitemap kann von Suchmaschinen benutzt werden, um auch an Unterseiten zu gelangen, die nicht so einfach über die normale Navigation erreichbar sind.

Was bringt mir die Sitemap außerdem?

Google bietet mit seinen Webmaster-Tools eine nette Sammlung von Tools an, die dir einen Überblick über die Crawling- und Index-Aktivitäten verschaffen. Ebenso werden Probleme beim Crawlen deiner Webseite angezeigt sowie das Datum des letzten Crawling-Durchlaufs uvm. All das macht das Anbieten einer Sitemap ziemlich attraktiv.

Beispiel einer Sitemap

Wie erwähnt ist eine Sitemap eine XML-Datei. Diese enthält ein Element <url> für jede erreichbare Adresse deiner Webseite. Innerhalb dieses Elements können dann verschiedene Angaben zu der entsprechenden Seite angegeben werden. Die wichtigsten sind loc (location - Adresse), changefreq (wie oft ändert sich die Seite), priority (Priorität der Seite im Vergleich zu den anderen Seiten). Die Priorität reicht dabei von 0 bis 1.0, wobei 1.0 den Maximalwert markiert.

Beispiel:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
 <url>
  <loc>http://blog.klappity.de/</loc>
  <changefreq>daily</changefreq>
  <priority>1.0</priority>
 </url>
 <url>
  <loc>http://blog.klappity.de/impressum.php</loc>
  <changefreq>monthly</changefreq>
  <priority>0.1</priority>
 </url>
</urlset>

In dieser Sitemap sind zwei Seiten angegeben. Meine Startseite sowie mein Impressum. Das Impressum ändert sich ziemlich selten, deshalb als changefreq monthly. Die Priorität des Impressums ist ebenfalls ziemlich gering, ich habe einen Wert von 0.1 angegeben. Im Gegensatz dazu ist die Startseite die wichtigste Seite - also eine Priorität von 1.0.

Wie erstelle ich eine Sitemap mit PHP

Eine Sitemap für einen Blog zu erstellen ist nicht besonders schwer, da es nur wenige Arten von Seiten gibt. Neben der Startseite hat jeder Beitrag eine eigene Seite. Dazu kommen dann die Kategorie- oder Rubrikseiten, die Monatsseiten sowie die Übersichtsseiten mit den älteren Beiträgen. Zu all diesen Seiten muss man die Adresse kennen bzw. ermitteln können, um die Sitemap automatisch mit PHP beim Zugriff zu erzeugen.

Bei mir sieht die Generierung der Sitemap folgendermaßen aus. Als erstes füge ich alle Seiten mit fester Adresse ein (die Adressen stehen in der Config), hierzu zählen z.B. die Startseite und das Impressum. Alle weiteren Seiten, also Beiträge, Rubrikseiten ermittle ich aus der Datenbank und füge sie der Sitemap hinzu. Die Daten werden übrigens erst einmal in einen Array eingefügt aus dem dann die eigentliche XML-Datei erzeugt wird. Bei Fragen zur Registry oder Settings-Klasse siehe Artikel Blog mit PHP.

<?php
// Registry, Settings
$registry Registry::getInstance();
$settings $registry->getSettings();
// Datenbankverbindung
$dbh $registry->getDbh();

// Array mit allen Seiten
$sitemap = array();

/*
 * Feste Seiten in die Sitemap einfügen
 * - Startseite (1.0)
 * - Impressum (0.0)
 */
$sitemap[] = array(
    
'loc' => $settings->get('url.root'),
    
'changefreq' => 'daily',
    
'priority' => 1.0
);
$sitemap[] = array(
    
'loc' => $settings->get('url.root') . $settings->get('url.impressum'),
    
'changefreq' => 'monthly',
    
'priority' => 0.1
);

/*
 * alle Posts einfügen (0.8)
 * die Selektierung der Posts soll hier mal keine Rolle spielen,
 * der Code hier ist speziell für meinen Blog.
 * Entscheidend ist, dass alle Posts selektiert werden.
 */
list($count_posts) = $dbh->execute('SELECT count(*) FROM `posts`')->fetch_row();
$criterias = new Model_Criteria(Model_PostPeer::LIMIT_START0);
$criterias = new Model_Criteria(Model_PostPeer::LIMIT$count_posts);
$stmt Model_PostPeer::doSelect($criterias);
while(list(
$id$categories_id$users_id$headline$text$date,
    
$comments_count$category_name$user_name) = $stmt->fetch_row()){

    
// den Link auf den vollen Post zusammen setzen
    
$link_post =
        
$settings->get('url.root') .
        
$settings->get('url.post') .
        
View_UrlFormatter::postUrl($id$headline) . "/";
    
// zur Sitemap hinzufügen
    
$sitemap[] = array(
        
'loc' => $link_post,
        
'changefreq' => 'weekly',
        
'priority' => 0.8
    
);
}

/*
 * alle weiteren Seiten einfügen ...
 */


/*
 * Aus dem Array mit allen enthaltenen URL's  die Sitemap erstellen
 */
$xmlWriter = new xmlWriter();
$xmlWriter->openMemory();

$xmlWriter->setIndent(true);
$xmlWriter->setIndentString(" ");

$xmlWriter->startDocument('1.0''UTF-8');

$xmlWriter->startElement('urlset');
$xmlWriter->writeAttribute('xmlns',
    
'http://www.sitemaps.org/schemas/sitemap/0.9');

foreach(
$sitemap as $element){
    
$xmlWriter->startElement('url');
    
    
$xmlWriter->writeElement('loc',
        
$element['loc']);
    
$xmlWriter->writeElement('changefreq',
        
$element['changefreq']);
    
$xmlWriter->writeElement('priority',
        
number_format($element['priority'], 1'.'','));
    
    
$xmlWriter->endElement();
}

$xmlWriter->endElement();
$xmlWriter->endDocument();

// als XML-Datei senden
header("Content-Type: text/xml");
print 
$xmlWriter->outputMemory(true);


?>

Dieses PHP-Skript generiert dynamisch für meinen Blog eine Sitemap mit allen Seiten. Die XML-Datei wird am Ende gesendet. Damit dies korrekt geschieht und die XML-Datei auch im Browser angezeigt wird, wird vorher noch der entsprechende Header gesendet. Weitere Informationen zum Theme Sitemap sind auf der offiziellen Seite zu finden (klick)

Tipp 1: Sitemap-Umleitung mit mod_rewrite

Die Sitemap wird jetzt mit PHP generiert und ist somit über sitemap.php erreichbar. Das Skript generiert eine XML-Datei, es wäre also viel schöner, wenn die Sitemap auch über sitemap.xml erreichbar ist. Dies kann mit Hilfe von mod_rewrite leicht erreicht werden. Es muss lediglich die Adresse sitemap.xml auf sitemap.php umgeleitet werden. Folgender Eintrag ist dazu in der Datei .htaccess im Verzeichnis in dem das Skript sitemap.php liegt notwendig - vorausgesetzt mod_rewrite ist eingeschaltet.

RewriteRule ^sitemap.xml$ sitemap.php [L]

Das [L] am Ende bedeutet, dass die die letzte zu beachtende Umleitungsregel ist.

Tipp 2: Zugriff auf die Sitemap kontrollieren

Wer nicht möchte, dass jeder an seine Sitemap herankommt, den Zugriff z.B. auf bestimmte Suchmaschinen beschränken, kann dies durch eine kleine Erweiterung des PHP-Skripts zur Erzeugung der Sitemap realisieren. Insbesondere wenn man den Pfad zu seiner Sitemap-Datei in der robots.txt angegeben hat, ist es für jeden sehr einfach an diese Datei heranzukommen. Mit Hilfe einer Sitemap kann man eine Seite deutlich einfacher und schneller scrapen und an den Content kommen, als es ohne der Fall wäre. Dieser Umstand macht es durchaus sinnvoll, die Sitemap zu schützen. Folgender Test muss dazu in das PHP-Skript eingefügt werden.

<?php
if(
    
preg_match('/(Googlebot|Slurp)/',
        
$_SERVER['HTTP_USER_AGENT'])
    && 
preg_match('/(\.googlebot\.com|\.yahoo\.net|\.inktomisearch\.com)$/',
        
gethostbyaddr($_SERVER['REMOTE_ADDR']))
    && (
gethostbyname(
        
gethostbyaddr($_SERVER['REMOTE_ADDR'])) == $_SERVER['REMOTE_ADDR'])){

    
// Sitemap generieren wie oben angegeben ...

}else{
    
header('HTTP/1.1 404 Not Found');
}
?>

Als erstes wird der User-Agent auf Hinweise für Suchmaschinen gecheckt. Da dies als Test natürlich nicht reicht, wird danach mittels DNS/Reverse-DNS-Check geprüft, ob der Zugriff auch wirklich von einer der großen Suchmaschinen stammt. Die Liste der erlaubten Zugriffsquellen ist natürlich beliebig erweiterbar. Falls der Check fehlschlägt, wird hier gleich ein 404 Not Found gesendet - man kann in diesem Fall aber auch einfach eine Fehlermeldung ausgeben. Gefunden habe ich diesen Tipp im SISTRIX Blog.

yigg

0 Kommentare zu: Blog-Sitemap mit PHP

Einen Kommentar schreiben






Captcha

Beiträge nach Rubrik
Amazon.de: Bestseller RSS