Apache Rewrite Rules and Redirect

Apache Vhost

Einfacher 301 Redirect im Apache Vhost

<VirtualHost *:80>
ServerName www.servername.com
Redirect 301 / http://neuer-servername.com
</VirtualHost>

.htaccess Datei

Einfacher Redirect innerhalb der .htaccess Datei

RewriteEngine On
Redirect 301 / http://www.neue-domain.de

Rewrite innerhalb der .htaccess Datei

-> Alte Domain (mit und ohne www) nach neue Domain

RewriteEngine On
RewriteCond %{HTTP_HOST} (www\.)?alte-domain.de
RewriteRule (.*) http://www.neue-domain.de/$1 [R=301,L]

RewriteCond Query String

Arbeitet man mit URL Parametern und möchte anhand dieser eine RewriteRule greifen lassen, dann sieht es so aus, z.B. entfernen der jumpurl Funktion bei Typo3 mit anschließenden Umleiten auf die Startseite des Vhost

RewriteEngine On
RewriteCond %{HTTP_HOST} (www\.)?domain-name\.de
RewriteCond %{QUERY_STRING} jumpurl=(.*)$$
RewriteRule ^(.*)$  http://www.domainname/$1? [R=301,L]

Weiß man nicht, was alles in einen Query_String mitgeliefert wird, da man nur einen Beispielaufruf hat, dann kann man sich auf seinem Testserver eine PHP Datei anlegen mit dem folgenden Inhalt:

 <?php echo $_SERVER['QUERY_STRING']; ?>

und als index.php auf den Server speichern und mit dem Aufruf ein wenig herumspielen.

Index.html aus URL entfernen

Es gibt Menschen, die haben Angst vor einer index.html innerhalb der URL, denen kann mit dem folgenden Eintrag innerhalb der .htaccess Datei geholfen werden

RewriteEngine On
RewriteCond %{REQUEST_URI} ^(.*)/index.html(.*)$
RewriteRule ^(.*)$ %1%2 [R=301,NE,L]

Möchte ich, sobald jemand ein gelöschtest Bild in meiner Gallerie aufruft anstelle eines 404 Fehlers einen Platzhalter ausliefern, so habe ich dafür zwei Möglichkeiten (wahrscheinlich gibt es noch etliche mehr)

Einen externen Rewrite

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ http://www.mein-server/images/sorry.jpg

Einen internen Rewrite

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^(.*)$ /images/sorry.jpg

Was machen die zwei Varianten

Externer Rewrite

-> Es verändert sich die URL, man sieht, daß das was man aufgerufen hat nicht da ist und das anstelle dessen etwas anderes geladen wurde.

-> Man kann je nach Protokoll 80 (HTTP) 443 (HTTPS) etwas anderes zurückgeben

-> Man ist darauf angewiesen, daß man dort, wo die RewriteRule zum Einsatz kommt auch unterscheiden kann, ob dort etwas auf Port 80 oder 443 ankommt.

Interner Rewrite

-> man muß nicht wissen auf welchen Port die Anfragen eintreffen.

-> Es verändert sich nicht die URL im Browserfenster, man sieht nicht, daß man eigentlich einen 404 Fehler produziert hat.

-> man kann nicht getrennten Inhalt für Port 80 oder 443 ausliefern.

 

Erklärung:

301  -> permanente Weiterleitung, der alte Aufruf in den Suchergebnissen soll dauerhaft durch den neuen ersetzt werden

302  -> temporäre Weiterleitung, der Aufruf soll nur vorübergehend gültig sein, der alte Aufruf wird nicht aus den Suchergebnissen gelöscht.

RewriteRule  -> Was soll wohin umgeleitet werden.

RewriteCond  -> Die Bedingung die erfüllt sein muß, damit die RewriteRule greift.

%{HTTP_HOST}  -> Abgreifen des Domainnames für eine RewriteCond

%{QUERY_STRING}  -> Abgreifen eines URL Parameters für eine RewriteCond

%{REQUEST_URI}  -> Abgreifen eines Teils innerhalb der URL (nicht eines Parameters)

NC  -> Ignoriere Groß-/Kleinschreibung

NE  -> Kein „Escapen“ von Zeichen innerhalb der URL

QSA  -> Übergebe den angefragten Query String der Anfrage unverändert an die neue Adresse RewriteRule
%{REQUEST_FILENAME}  -> Überprüfen ob mit „-f“ ein File (Datei) existiert, mit „-d“ ein Verzeichnis existiert bzw. mit „-l“ ob ein Link existiert.