Logo: @Bastianoso : Blogger, Fotograf, Webhoster

HTTP-Statuscodes vieler URLs überprüfen

Mit einem einfachen Bash-Script lässt sich der zurückgelieferte HTTP-Statuscode vieler URLs im Handumdrehen überprüfen und in ein Logfile schreiben. Insbesondere beim Relaunch einer bestehenden Webseite lassen sich die eingerichteten Redirects so sehr schnell überprüfen.

urlchecker

Als ich kürzlich meine Fotowebseite einem Redesign unterzogen habe, haben sich in diesem Zuge auch viele der bestehenden URLs geändert. Um den Besuchenden der Webseite jetzt nicht vermehrt die 404er-Seite unter die Nase zu halten, habe ich für jede alte URL ein Redirect auf die neue Adresse eingerichtet.
Um sicherzugehen, dass dabei keine der alten Adressen unter den Tisch gefallen ist, suchte ich eine Möglichkeit, eine Liste von URLs (in diesem Fall die alten URLs) automatisch nach dem zurückgelieferten HTTP-Statuscode abzugrasen.
Theoretisch sollte für jede alte URL ein 301er Redirect zurückgeliefert werden.

So funktioniert das Script

Das Bash-Script liest eine vorher angelegte Liste von URLs ein und geht diese Zeilenweise durch. Dabei wird eine einfach Anfrage an diese URL gestellt und der zurückgelieferte Statuscode auf dem Bildschirm ausgegeben (beispielweise Status 200 für okay oder Status 404 für nicht gefundene Seiten).
Ist das Script einmal durchgelaufen, wird alles in ein Logfile geschrieben, damit man die Ergebnisse später in Ruhe auswerten kann.

Systemanforderungen

Lauffähig ist das Script auf allen Systemen, denen eine Bash zur Verfügung steht (in der Regel, UNIX, LINUX, Mac OS X) und natürlich braucht man einen Internetanschluss.

Umfang

Zum Script gehören drei Dateien, von denen zwei im folgenden Zip enthalten sind:

Installationshinweise

  1. lade Dir die Zip-Datei herunter
  2. entpacke die Datei in ein beliebiges Verzeichnis
  3. pflege Deine zu prüfenden URLs in die Datei urls.txt ein (pro Zeile eine voll qualifizierte URL)
  4. öffne Deine Shell und navigiere in das Verzeichnis, in dem das Script liegt
  5. starte das Script mit dem Befehl „bash URLChecker.sh
  6. warte, bis alle URLs geprüft wurden und schaue Dir das Logfile an (liegt im gleichen Ordner wie das Script ab)

Der Quelltext

#!/bin/bash

SetParam() {
	export URLLISTE="urls.txt"
	export ZEITPUNKT=`date +%d.%m.%Y@%H:%M:%S`
	export LOGFILE="url-status.log"
}

StatusCode() {
	SetParam
	cat $URLLISTE | while read next
	do
		CODE=`curl --output /dev/null --silent --head --write-out '%{http_code}\n' $next`
	case $CODE in
		100) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Continue)" ;;
		101) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Switching Protocols)" ;;
		102) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Processing (WebDAV) (RFC 2518) )" ;;
		103) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Checkpoint)" ;;
		122) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Request-URI too long)" ;;
		200) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (OK)" ;;
		201) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Created)" ;;
		202) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Accepted)" ;;
		203) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Non-Authoritative Information)" ;;
		204) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (No Content)" ;;
		205) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Reset Content)" ;;
		206) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Partial Content)" ;;
		207) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Multi-Status (WebDAV) (RFC 4918) )" ;;
		208) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Already Reported (WebDAV) (RFC 5842) )" ;;
		226) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (IM Used (RFC 3229) )" ;;
		300) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Multiple Choices)" ;;
		301) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Moved Permanently)" ;;
		302) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Found)" ;;
		303) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (See Other)" ;;
		304) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Not Modified)" ;;
		305) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Use Proxy)" ;;
		306) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Switch Proxy)" ;;
		307) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Temporary Redirect (since HTTP/1.1))" ;;
		308) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Resume Incomplete)" ;;
		400) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Bad Request)" ;;
		401) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Unauthorized)" ;;
		402) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Payment Required)" ;;
		403) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Forbidden)" ;;
		404) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Not Found)" ;;
		405) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Method Not Allowed)" ;;
		406) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Not Acceptable)" ;;
		407) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Proxy Authentication Required)" ;;
		408) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Request Timeout)" ;;
		409) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Conflict)" ;;
		410) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Gone)" ;;
		411) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Length Required)" ;;
		412) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Precondition Failed)" ;;
		413) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Request Entity Too Large)" ;;
		414) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Request-URI Too Long)" ;;
		415) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Unsupported Media Type)" ;;
		416) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Requested Range Not Satisfiable)" ;;
		417) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Expectation Failed)" ;;
		500) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Internal Server Error)" ;;
		501) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Not Implemented)" ;;
		502) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Bad Gateway)" ;;
		503) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Service Unavailable)" ;;
		504) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (Gateway Timeout)" ;;
		505) echo "Status vom $ZEITPUNKT von der URL $next: $CODE (HTTP Version Not Supported)" ;;
		esac
	done;
}

Main() {
	StatusCode
}
SetParam
Main | tee -a $LOGFILE

Randnotizen

Das Script basiert auf einer Idee von Ramakanta und wurde von mir für den benötigten Zweck etwas angepasst.
Es wäre auch denkbar, das Script noch um eine Abfrage des gewünschten Statuscodes zu erweitern, sodass im Logfile nur die Statuscodes landen, die diesem nicht entsprechen.

In meinem Fall könnte man den Statuscode 301 exkludieren und nur URLs auflisten, die einen anderen Status zurückliefen (bspw. 404). Für meine Zwecke hat das Script aber so sehr schön seinen Dienst getan.

Wer das Script erweitern möchte, kann sich gerne im GIT bedienen.


Was meinst Du dazu?

Deine E-Mail-Adresse wird nicht veröffentlicht.
Pflichtfelder sind mit * markiert.

Artikel abonnieren: E-Mail | RSS-Feed