Fix 404

Es lässt sich nicht immer vermeiden, dass ich eine Seite in der Verzeichnisstruktur umziehe und sich damit der Pfad ändert. Leider gibt es mein "Sharepoint Designer CMS" nicht her, dass ich "Permalinks" habe und aufgrund der 20 Jahre Existenz gibt es auch sehr viele Links von anderen Seiten auf die MSXFAQ und führt zu Fehlern in Suchmaschinen.

Google Webmaster Tools

Die Suchmaschine Google hat extra ein Bericht für solche Links, die ins leere laufen. Bei mir sind es im März 2017 schon 574 Links, die sich so angesammelt haben.

Meist gibt es die Seiten ja noch in der ein oder anderen Form und sind nur verschoben worden. Also habe ich mir überlegt, wie ich möglichst automatisch diese Links wieder "aufleben" lassen kann.

.htaccess und Rewrite

Auf einem Apache Server gibt es die Option über Einträge in der HTACCESS einen Rewrite einer URL zu veranlassen. Dort gibt es heute schon einige Einträge, mit denen ich komplette Verzeichnisse und Bereiche umgeordnet habe. Die früher "reinen Exchange Site" wurde um Skype Business und Office 365 erweitert., so dass ich eine Bereichsebene einziehen musste.

RewriteEngine On
RedirectMatch 301 /office365 /cloud$1
RedirectMatch 301 /cloud/produkte /cloud/technik$1
RedirectMatch 301 /migration /exchange/migration$1
RedirectMatch 301 /notfall /exchange/notfall$1
RedirectMatch 301 /archiv /sonst/archiv$1
RedirectMatch 301 /ideen /sonst/ideen$1
RedirectMatch 301 /events /sonst/events$1
RedirectMatch 301 /verschiedenes/bastelbude /sonst/bastelbude$1
RedirectMatch 301 /verschiedenes /windows$1
RedirectMatch 301 /backstage /sonst/backstage$1
RedirectMatch 301 /uc /lync/exchangeum$1

Auf dieser Basis kann ich natürlich noch mehr "ReWrite"-Einträge addieren. Das ist aber sicher nichts für eine manuelle Erstellung.

Pass1: Powershell und Google-Input

Zuerst habe ich mit die Google-Information als CSV-Datei heruntergeladen. Sie kann sehr einfach in PowerShell eingeladen werden

Also habe ich mir erst mal eine Liste der aktuellen Dateien der MSXFAQ besorgt und in eine Hashtable gelegt. Der "Key" ist dabei der Dateiname und der Value der komplette Pfad

[hashtable]$filelist=@{}
foreach ($file in (Get-ChildItem -recurse 'C:\\Meine Websites\www.msxfaq.de\*.htm')) {
   write-host "." -nonewline
   $filelist[$file.name]=$file.fullname
}

Diese Kurzversion übernimmt natürlich immer nur die letzte Version einer gleichnamigen Datei. Ein Großteil entfällt hier auf die "index.htm", die es natürlich sehr oft gibt. Auch das kann man übrigens ganz schnell ermitteln.

$dubletten = Get-ChildItem -recurse 'C:\\Meine Websites\www.msxfaq.de\*.htm' |select name,fullname | group name | ?{$_.count -gt 2}

Es gab aber schon einige gleichnamige Dateien, z.B. "version.htm", "lizenz.htm" etc. Die werde ich noch aufräumen müssen. Für den ersten Schritt sollte es aber reichen.

Also habe ich dann die CSV-Datei von Google geschnappt, den Dateinamen ermittelt und über die Hashtable das Ziel bestimmt.

$baseurl = "http://www.msxfaq.de"
$localpath = "C:\\Meine Websites\www.msxfaq.de"

foreach ($404page in (Import-Csv .\googlefail.csv )){ 
   $shortname = ($404page.URL.split("/"))[-1]
   if ($filelist.containskey($shortname)){
      ("Redirect 301    "+ $404page.URL.replace($baseurl,"")+" "+ ($filelist[$shortname]).replace($localpath,"").replace("\","/"))
   }

Die Ergebnisdatei habe ich dann in die bestehende HTACCESS addiert und schon sollten die Umleitungen auch funktionieren.

Weiterentwicklung

Allerdings ist das natürlich immer nur ein nachträgliches Korrigieren von Fehlern. Daher plane ich mittelfristig, dass ein Skript einfach die gültigen Dateinamen einsammelt und speichert, so dass ich auch andere lokale Veränderungen erkennen kann und schon präventiv die 301-Umleitungen addieren kann. Interessant ist hier aber sogar der umgekehrte Fall, dass ich die 404-Fehler aus den Webserver-Logs nun gegen die "Liste der gültigen URLs" gegenchecke

So kann ich zum einen wirklich "bad links" finden aber zum anderen natürlich auch versuchte Einbrüche oder eventuell sogar erfolgreiche Einbrüche erkennen. Denn meine MSXFAQ besteht ja nur aus statischen HTML-Seiten, deren Pfad zu 100% "bekannt" ist.

Weitere Links