Seit es die sinnvolle Erweiterung des Sitemaps.org-Standards gibt, die erlaubt, dass man den Pfad zu seiner Sitemaps-Datei in der robots.txt hinterlegt und sich diese nicht für jede Suchmaschine einzeln anmelden, authentifizieren und einreichen muss, ist leider auch die Gefahr gestiegen, dass Scraper und sonstiger Webabschaum sich dort bedient. Gerade Contentdieben wird es so sehr leicht gemacht – die Seitenstruktur liegt offen vor ihnen und muss nicht erst mühsam zusammengecrawled werden.
Ich bin bei den meisten unserer Projekte jetzt dazu übergegangen, nur noch den etablierten Suchmaschinen Zugriff auf die Sitemaps-Dateien zu gewähren. Dies ist zwar nicht unbedingt schön, da so neue, noch kleine Suchmaschinen benachteiligt werden aber in Abwägung der Vorteile war es mir das wert.
Umgesetzt wird diese Zugriffskontrolle über Cloaking: Google, Yahoo, Microsoft und Ask.com erhalten die Sitemap, andere Clients eine Fehlermeldung. Auch wenn Cloaking eigentlich nicht gerne gesehen wird, so ist es hier legitim, da es nicht zum Ziel hat, User oder Suchmaschinen zu täuschen.
<?php
include(if(preg_match('/(Googlebot|Slurp|Jeeves|msnbot)/', $_SERVER['HTTP_USER_AGENT'])
&& preg_match('/(.googlebot.com|.yahoo.net|.inktomisearch.com|.ask.com|.live.com)$/', gethostbyaddr($_SERVER['REMOTE_ADDR']))
&& (gethostbyname(gethostbyaddr($_SERVER['REMOTE_ADDR'])) == $_SERVER['REMOTE_ADDR'])) {
} else {'/path/to/real/sitemapfile.xml');
}header('HTTP/1.1 403 Forbidden');
echo '<html><head><title>Zugriff verweigert</title></head><body><h1>Zugriff verweigert</h1>
Der Zugriff auf unsere Sitemaps ist nur den gängigen Suchmaschinen erlaubt. Bitte
besuchen Sie die <a href="http://'.$_SERVER['HTTP_HOST'].'">Startseite</a>.</body></html>';
?>
Der PHP-Code prüft zuerst, ob im User-Agent des Clients in Hinweis darauf vorhanden ist, dass es sich um einen Bot der vier großen Suchmaschinen handelt. Dann wird über die mittlerweile von allen großen Suchmaschinen unterstütze Authentifizierung der Crawler mittels DNS/Reverse-DNS-Check geprüft, ob der Crawler auch „echt“ ist. Sollte dies alles zutreffen, wird die Sitemaps-Datei ausgegeben, andernfalls gibt es eine Fehlermeldung. Sehen kann man das zum Beispiel auf dieser Domain: sitemap.xml
Netter Tipp, aber versteh ich das nun richtig? Laut deinem Code muß ich dem Apachen erst beibringen das er XML-Files wie PHP parsen soll? Der von dir gepostete Code muß dann in eine Datei namens sitemap.xml welche im bedarfsfall die echte XML-Datei includet und an den Client ausliefert? (Ist noch früh am morgen :-))
Kommt sicherlich immer auf die praktische Umsetzung im konkreten Projekt an. Hier auf der Domain läuft das so:
In der .htaccess steht folgende Rewrite-Rule:
RewriteRule ^sitemap.xml$ sitemap.php
In der sitemap.php dann der obrige Code, anstelle des includes habe ich bei mir jetzt halt den PHP-Code, der die normale XML-Sitemap generiert (Blogurls raussuchen, in XML packen, ausliefern). Wenn man eine statische, fertige XML-Sitemap hat, nennt man die halt um in altetollexmlsitemap.xml und included die in der sitemap.php
Ah jetzt ja, eine Insel 🙂 Danke dir. An das URL-Rewriting hab ich nun garnicht gedacht 🙂 das werd ich doch einfach mal antesten, danke dir jedenfalls für den Tipp
Na ob das was bringt? Wenn ich Content klaue bin ich immer als ‚Googlebot‘ unterwegs. 😉
Mag sein, durch die Prüfung wirst du damit allerdings nicht kommen, da du keinen Zugriff auf die Zonefiles für die Domain googlebot.com hast.
Bei
preg_match(‚/(googlebot\.com|yahoo\.net|ask\.com|live\.com)$/‘, gethostbyaddr($_SERVER[‚REMOTE_ADDR‘]))
würde ich dann noch einen . vor die einzelnen Domains machen, sonst kann man z.B. auch mit einer IP die auf „mein-eigener-googlebot.com“ auflöst die Sitemap abholen.
Sorry – den DNS-Check habe ich gestern total übersehen. Ist so eine super Lösung.
Die Idee ist super. Ich sträube mich natürlich ein wenig gegen den zusätzlichen Aufwand mit folgenden Logik: Ich schätzte Contentdiebe bislang so ein, dass sie sich vielleicht sowieso erst ein ganzes Projekt ziehen, also die Seite eh komplett durchgehen. Oder themenrelevante Inhalte suchen und dabei gezielt über Google auf Einzelseiten kommen. Die hier angegebene Version dürfte also nur gegen die gerichtet sein, die sich sowieso schon bedienen und in der Sitemap nach Aktualisierungen suchen. Oder irre ich mich hier?
Frank, das Problem sehe ich darin, dass man über dieses „Auto-Discovery-Feature“, also die Angabe der URI zur kompletten Sitemap in der robots.txt, jetzt sehr schnell an die Struktur der Seite kommt. Das war früher so nicht möglich und ich kann mir vorstellen, dass das recht bald auch im großen Stil ausgenutzt wird. Ich habe bereits die ersten „Benutzer“, die in der robots.txt nach der Sitemap gesucht haben und dann auch versuchten, diese aufzugrufen – und das wird bei vielen vermutlich nicht aus wissenschaftlichem Interesse passieren.
Sven, das ist richtig. Allerdings gibt es ja für das Sitemaps-Protokoll mittlerweile eine Erweiterung, die auf den Namen „Autodiscovery“ hört. Dabei schreibt man in seine robots.txt die Zeile „Sitemap: example.org/sitemapfile.xml“ und die Crawler der Suchmaschinen und _alle_, die sich die robots.txt ansehen, lesen das dann aus. Deine Version funktioniert, wenn man die Sitemap für jedes Projekt und jede Suchmaschine eigenhändig bei den Suchmaschinen anmelden möchte.
Warum einfach, wenns auch kompliziert geht?
Wenn man die Sitemap unbedingt auf den Namen Sitemap.xml taufen muss, dann ist es ja klar, wenn die Sitemap auch von anderen Bots gefunden wird. Den Namen für die Datei gibt ja schließlich jeder ein!
Benennt man die Datei einfach um, z.B.:
klfjsdoj908.xml
Dann sollte auch kein fremder Bot drauf kommen, dass diese Datei überhaupt existiert. Verzeichnis Browsing hat ja wohl kaum jemand an!
So, bin jetzt mal wieder schlauer 😉
Hey Johannes.
Du darfst *.inktomisearch.com in Deiner PHP-Blocker-Routine nicht vergessen 😎 Bei mir crawled der mehr als yahoo.net.
Yahoo hat ja eigentlich von einiger Zeit angekündigt, von inktomisearch.com auf yahoo.net zu wechseln . In Zukunft wird man deswegen vermutlich nur noch yahoo.net-hosts sehen aber für die Übergangszeit kann es natürlich sinnvoll sein, inktomi noch mit reinzunehmen, Danke für den Hinweis.
Ist der Code noch aktuell?
Kann ich das Ganze auch mit sitemap.gz realisieren?
Gregor, der Code ist noch aktuell. Ob du nun eine komprimierte Sitemap durchreichst oder nicht, dürfte egal sein – eventuell musst du die Header anpassen.
In wie fern muss ich die Header anpassen? Kannst Du mir ein Beispiel zeigen?