Hinweise zu Mod-Rewrite bzw. Rewrite-Regeln im Allgemeinen 

403-Fehler mit RewriteEngine

Wenn beim Aktivieren der Rewrite-Engine des Apache die Webseite nicht mehr angezeigt wird, sondern der Apache stattdessen einen 403 oder 500-Fehler zeigt, so liegt dies an einer fehlenden Anweisung.

mod_rewrite wird intern behandelt wie symbolische Links, welche per Default aus Sicherheitsgründen verboten sind.

Um diese zu aktiviern, ergänzen Sie in der .htaccess-Datei folgende Zeile:

Options +SymlinksIfOwnermatch

Anschließend sollte die Webseite korrekt angezeigt werden.

Falls dies ebenfalls fehl schlägt, finden Sie im Error-Log des Webservers weitere Hinweise auf die Fehlerursache.

Unterordner von Rewrite-Regeln ausnehmen

Werden beispielsweise eine Webseite per Joomla/Drupal realisiert, so werden mittels Rewrite-Regeln URLs auf das CMS geleitet, die so nicht als Datei existieren. Das CMS erkennt dann intern, welche Inhalte angefragt werden und zeigt diese an.

Dies wird in der .htaccess-Datei mit (vereinfacht) folgenden Rewrite-Regeln realisiert:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L]

Somit werden alle Anfragen auf Inhalte, die weder als Datei noch als Verzeichnis tatsächlich existieren, intern auf die „index.php“ umgeschrieben.

Wird allerdings in einem Unterverzeichnis ein anderes CMS, beispielsweise Wordpress, installiert, welches ebenfalls von diesen Rewrite-Regeln gebrauch machen will, so kommt es bei nicht existierenden Dateien zu Konflikten: Da der Webserver die .htacecss-Dateien in der Verzeichnis-Reihenfolge verarbeitet, werden die „oberen“ Regeln des CMS (hier: Drupal/Joomla) schon ausgeführt, bevor die Rewrite-Regeln im Blog-Ordner überhaupt berücksichtigt werden.

Gelöst wird dies, indem der Unterordner von der Rewrite-Verarbeitung ausgenommen und die Ausführung somit beendet wird:

RewriteEngine On
RewriteRule ^blog - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L]

Anfragen, die mit „blog“ beginnen, werden somit nicht weiter durch ModRewrite verarbeitet und die weiteren Regeln ignoriert. Der Webserver kann nun im Unterordner des Blogs dessen Rewrite-Regeln prüfen und verarbeiten.

Hier muss natürlich der Unterordner korrekt definiert werden:

RewriteEngine On
RewriteBase /blog/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /blog/index.php [L]