Eigene Wartungsseite schalten

Manchmal kommt man nicht umhin, komplexere Wartungsarbeiten direkt auf den Produktivsystemen vorzunehmen.
Viele Content Management- und Shop-Systeme bringen dafür einen Wartungsmodus mit, den man einfach aktivieren kann. Alle Aufrufe, die nicht von der eigenen IP-Adresse kommen, sehen dann nur eine Wartungsseite, man selbst kann die Webseite ganz normal bedienen.

Bietet das im Einsatz befindliche System keine Möglichkeit einen extra Wartungsmodus zu aktivieren, so kann man sich mit ein paar Einträgen in der .htaccess-Datei aber leicht selbst helfen und eine eigene Wartungsseite definieren.

Wartungsseite mit einer freigeschalteten IP-Adresse

Arbeitet man alleine an der Webseite, reicht es die eigene IP-Adresse freizuschalten. Diese erfahren Sie hier.

<IfModule mod_rewrite.c>
 RewriteEngine on
 RewriteCond %{REMOTE_ADDR} !^123\.456\.789\.012
 RewriteCond %{REQUEST_URI} !/wartung.php$ [NC]
 RewriteCond %{REQUEST_URI} !\.(jpe?g?|png|gif) [NC]
 RewriteRule .* /wartung.htm [R=302,L]
</IfModule>

Die IP-Adresse 123.456.789.012 muss natürlich dann durch die entsprechend korrekte IP-Adresse ersetzt werden.

Wartungsseite mit mehreren freigeschalteten IP-Adressen

Arbeiten mehrere Personen von unterschiedlichen Internetanschlüssen aus an der Webseite, bietet es sich an, alle IP-Adressen freizuschalten, die Zugriff auf die Webseite benötigen.
Dies lässt sich mit folgenden Einträgen realisieren:

order deny,allow
deny from all
allow from 123.456.789.0
allow from 123.456.789.0
ErrorDocument 403 /wartung.htm

order allow,deny
allow from all

Beispiel einer Wartungsseite

Da für fremde IP-Adressen der Zugriff auf jegliche Ressourcen außer der angegebenen Wartungsseite untersagt ist, müssen Sie bei der Erstellung der HTML-Seite darauf achten, keine externen Ressourcen wie CCS-Dateien oder Bilder zu referenzierten. Diese könnten im Ernstfall dann nicht geladen/angezeigt werden.

Ich habe deshalb schon mal eine beispielhafte Wartungsseite erstellt, die Sie gerne benutzen und nach Ihren Wünschen anpassen können.

www wegrationalisieren

Streng genommen handelt es sich beim Zusatz „www“ um eine reguläre Third-Level-Domain.
Ihre weite Verbreitung ist historisch bedingt und technisch nicht zur reibungslosen Funktion einer Webseite notwendig, daher kann auch getrost auf den Zusatz verzichtet werden.

Um alle Aufrufe mit „www“ auf die Domain ohne die Subdomain umzuleiten, reichen diese fünf Zeilen aus:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.
RewriteCond %{HTTPS}s ^on(s)|off
RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www\.)?(.+)$
RewriteRule ^ %1%3%{REQUEST_URI} [R=301,L]

Natürlich funktioniert es auch umgekehrt, um das „www“ immer zu erzwingen.

www erzwingen

Streng genommen handelt es sich beim Zusatz „www“ um eine reguläre Third-Level-Domain.
Ihre weite Verbreitung ist historisch bedingt und technisch nicht zur reibungslosen Funktion einer Webseite notwendig, viele Menschen finden www.personenname.de aber schöner für das Auge, als nur personenname.de im Browser stehen zu haben.

Unsere Webserver reagieren daher per default auch auf Aufrufe per www-Subdomain, auch wenn diese nicht separat eingerichtet wurde.

Um auch Aufrufe ohne „www“ umzuleiten, reichen diese fünf Zeilen in der .htaccess-Datei:

RewriteEngine on
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Natürlich funktioniert das auch umgekehrt, um das „www“ immer zu vermeiden.

Assoziative Arrays in PHP 7

Wie vor ein paar Tagen angekündigt, werden wir demnächst die alte PHP-Version 5 deaktivieren.

Der Umstieg auf die neuere Version PHP 7 ist im Allgemeinen problemlos möglich, jedoch kommt es gegebenenfalls zu Problemen mit assoziativen Arrays, die in PHP 7 leicht anders deklariert werden müssen.

Bei assoziativen Arrays, auf dessen Values man nicht mit einem numerischen Keys á la $user[0] oder $user[1] zugreift, sondern Namen dafür benutzt (zum Beispiel: $user[id] oder $user[name]), so führt dies in PHP 7 zu einer Warnung im Logfile:

PHP Warning: Use of undefined constant name – assumed ’name‘ (this will throw an Error in a future version of PHP)

Aus dieser alten Notation:

$user[name]

Sollte für PHP 7 also diese Notation werden:

$user['name']

Um nicht händisch via Suchen & Ersetzen durch alle Codefiles gehen zu müssen, kann man sich mit diesem regulären Ausdruck die Arbeit vereinfachen:

RegEx-Ausdruck für assoziative Arrays in PHP 7

Mit einem einfachen regulären Ausdruck kann man sich viel Handarbeit im Code ersparen:

Suchen nach:

\[([a-zA-Z]+)\]

Ersetzen mit:

\['\1'\]

Das Suchmuster sucht nach den öffnenden und schließenden eckigen Klammern von Arrays [ + ] und prüft, ob darin alphabetische Zeichen von a bis z oder A bis Z drin vorkommen (mindestens eines, aber beliebig viele).

Lässt man das einmal über alle seine Daten laufen, sind die assoziativen Arrays korrekt ausgezeichnet. Ältere PHP-Versionen haben über diese, eigentlich falsche, Notation noch gütig hinweggesehen, aber bald ist es damit vorbei und die warning messages sind ein erstes Anzeichen dafür.

Apostroph escapen

Man muss natürlich kein Apostroph nehmen, normale Anführungszeichen eignen sich dafür auch. Nutzt man als Array-Index beispielsweise einen Namen, der ein Apostroph enthält (Ku’damm) ist es einfacher, direkt auf Anführungszeichen auszuweichen.

Nutzt man Apostrophe, kann man die in den values enthaltenen Apostrophe auch escapen: Ku\‘damm.

HTTPS als Standard

Sobald die Webseite mit einem SSL-Zertifikat ausgestattet ist, sollte man dieses natürlich auch nutzen.
Wenn das eingesetzte Content Management oder Shop-System nicht die Möglichkeit bietet, alle Aufrufe auf HTTPS umzuleiten, helfen diese Zeilen in der .htaccess-Datei dabei, dass die Webseite ausschließlich verschlüsselt aufgerufen werden kann:

RewriteEngine on
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Etwaig mit übergebene Parameter werden dabei mit übertragen.

UTF-8 Encoding als Standard definieren

Generell gilt die UTF-8- Zeichenkodierung als Standard und bietet über mehrere Sprachen hinweg die größte Flexibilität.

Sollten sich in komplexen Systemen manchmal anders kodierte Dateien in die Webseite mogeln, sorgen diese für eine fehlerhafte Zeichendarstellung. Die verursachenden Dateien ausfindig zu machen, kann schwierig werden.

Als schnelle Abhilfe lassen sich in der .htaccess-Datei mit den folgenden Zeilen standardmäßig Dateien UTF-8-kodiert ausgeben:

# UTF-8 Encoding für alle Inhalte, die text/plain oder text/html sind:
AddDefaultCharset utf-8

# UTF-8 Encoding nur für bestimmte Dateitypen aktivieren:
AddCharset utf-8 .atom .css .js .json .rss .vtt .xml

PHP Errorlogging selektiv aktivieren

Insbesondere bei der Entwicklung ist es vorteilhaft, das Errorlogging von PHP zu aktivieren.
Auf reinen Entwicklungssystemen erfolgt die Ausgabe der Fehler zumeist direkt im Browserfenster.

Wenn man jedoch auf Produktivsystemen arbeitet und die Fehlermeldungen anderen Webseitenbesuchern nicht anzeigen lassen möchte, hat man die Möglichkeit, die Fehler auch in eine Datei umzulenken.

Mit den folgenden Einstellungen in der .htaccess-Datei werden auftretende PHP-Fehlermeldungen direkt in eine Datei auf dem Server geschrieben.

# Dem Nutzer keine Fehler anzeigen
  php_flag display_startup_errors off
  php_flag display_errors off
  php_flag html_errors off
# Die Fehler in eine Datei schreiben
  php_flag log_errors on
  php_value error_log /pfad/zum/phperror.log

Der /pfad/zum/phperror.log muss natürlich entsprechend angepasst werden.

Wichtig: Die Datei muss bereits existieren und beschreibbar sein!

HTTP Status- und Fehlercodes verstehen

Auf Anfragen an einen Server erhält man als Antwort stets auch einen Statuscode, der technisch über das Ergebnis der Anfrage informiert. Insbesondere im Fehlerfall können die Statuscodes hilfreiche Informationen liefern, um dem Problem auf die Spur zu kommen.

Folgend eine Liste der gängigsten HTTP-Statuscodes:

200er Statuscodes für Erfolgsmeldungen

Bei erfolgreichen Operationen erhält man einen 200er Statuscode zurück:

  • 200 OK
  • 201 Created
  • 202 Accepted
  • 203 Non-Authorative Information
  • 204 No Content
  • 205 Reset Content
  • 206 Partial Content

300er Statuscodes für Weiterleitungen

Für eine erfolgreiche Bearbeitung sind weitere Schritte seitens des Clients erforderlich, meist Verweise auf andere URLs:

  • 300 Multiple Choices
  • 301 Moved Permanently
  • 302 Moved Temporarily
  • 303 See Other
  • 304 Not Modified
  • 305 Use Proxy

400er Statuscodes für Client-Fehlermeldungen

Bei der Ausführung der Anfrage ist ein Fehler aufgetreten, den der anfragende Client verursacht hat:

  • 400 Bad Request
  • 401 Authorization Required
  • 402 Payment Required (not used yet)
  • 403 Forbidden
  • 404 Not Found
  • 405 Method Not Allowed
  • 406 Not Acceptable (encoding)
  • 407 Proxy Authentication Required
  • 408 Request Timed Out
  • 409 Conflicting Request
  • 410 Gone
  • 411 Content Length Required
  • 412 Precondition Failed
  • 413 Request Entity Too Long
  • 414 Request URI Too Long
  • 415 Unsupported Media Type

500er Statuscodes für Server-Fehlermeldungen

Der der Ausführung der Anfrage ist ein Fehler auf Serverseite aufgetreten:

  • 500 Internal Server Error
  • 501 Not Implemented
  • 502 Bad Gateway
  • 503 Service Unavailable
  • 504 Gateway Timeout
  • 505 HTTP Version Not Supported