Wustis Blog

Der Blog über Tobias Wust und seine Reise

301 Redirects für .htaccess aus Sitemap.xml extrahieren

| Keine Kommentare

Mein Redirect Script

Mein Redirect Script in der Powershell ISE

Wie man mit Hilfe von Powershell aus einer Sitemap Datei die URLs für ein 301 Redirect in .htaccess bekommen kann zeige ich hier heute.

Mein Blog wird bald auf eine neue Domain umziehen. Damit alle Links hierher weiterhin erreichbar sind, will ich für alle Artikel im Blog einen 301 Redirect anlegen. Nun sind das aber natürlich schon einige Links, die da zusammengekommen sind und per Hand alle Redirects anlegen wäre blöd. Zum Glück habe ich ja schon eine Datei, in der alle Links stehen – meine Sitemap! Aus der Sitemap wollen die Links aber auch erstmal geholt werden. Man ist ja Programmierer und ich

habe mir schnell ein Script dafür gebastelt.

$input = 'C:\Users\Wust\Downloads\sitemap.xml'
$output = 'C:\Users\Wust\Downloads\redirect.txt'
$regex = 'tobiaswust.de/.*</loc>'
Select-string -Path $input -Pattern $regex -AllMatches | %{'Redirect 301 ' + $_.Matches.Value.Replace('</loc>','').Replace('tobiaswust.de','') + ' https://wust.me' + $_.Matches.Value.Replace('</loc>','').Replace('tobiaswust.de','')} > $output

 

In den Variablen $input und $output sind die Pfade zur sitemap Datei, aus der ich die Pfade auslesen will und zu der Datei, in die mir die Redirects erstellt werden sollen.
In der Variable $Regex habe ich ein Suchmuster, das genau so viel beinhaltet, dass eindeutig das richtige gefunden wird. tobiaswust.de ist klar, “.*” steht für dafür, das ein beliebiges Zeichen (.) beliebig oft (*) vorkommen kann. Damit würde aber unter umständern noch mehr kram hinter der URL stehen. Weil ich weiß, dass in der Sitemap hinter der URL immer </loc> steht habe ich das mit ins Suchmuster reingenommen.

Redirect.txt Screenshot

Meine erstellte Redirect Datei

Die nächste Zeile ist etwas unübersichtlich.
Select-String -Path $input -Pattern $regex -AllMatches: Es soll ein String in der Datei $input gesucht werden mit dem Muster $regex. Es gibt mehrere treffer, daher -AllMatches.

|: bedeutet nach diesem Befehl arbeite mit dem nächsten Befehl weiter.

%: ist die kurze Powershell abkürzung für foreach. Weil mit -AllMatches ja mehrere Treffer kommen, loope ich durch diese durch.

‘Redirect 301 ‘: ein String mit dem jede Zeile in meiner neuen Datei anfangen soll, damit ich das später nicht mehr schreiben muss.

$_: Bezeichnet das aktuelle Element aus der % Schleife.

.Matches: $_ ist noch kein Text, sondern ein Objekt, in dem noch ein paar mehr Infos zum Treffer abgelegt sind.

.Value: der Treffertext aus dem Objekt.

.Replace: hiermit schmeiße ich tobiaswust.de/ und </loc> raus, sodass nur der Teil vom Pfad übrig bleibt, den ich für den Redirect brauche.

>: leitet die Ausgabe in eine Datei um.

Danach kommt eigentlich das gleiche noch mal, nur dass die neue Domain vorangehangen wird.

Habt ihr schon mal etwas mit der Powershell gemacht?

Kommentar verfassen