APPEND_SLASH und PREPEND_WWW im Webserver
Djangos per Default aktive Middleware CommonMiddleware stellt zwei Parameter zur Verfügung, mit denen sich das Verhalten aller URLs ändern lässt.- PREPEND_WWW leitet eine Anfrage auf eine Seite ohne voran gestelltes www "http://example.org/" automatisch zur Domain mit www "http://www.example.org/" um.
- APPEND_SLASH fügt der URL, wenn sie nicht mit einem Slash endet, diesen an. Das ist auch das normale Verhalten der meisten Webserver, wenn ein Verzeichnis angefordert wird.
Beides ist eine Aufgabe die der Webserver schneller und wahrscheinlich resourcenschonender erledigen kann. Wer mod_rewrite seinem Apache zur Verfügung stellt, kann diese beiden Optionen auch direkt erledigen lassen. Ohne den mod_wsgi/mod_python Unterbau und ohne dass eine Codezeile von Django ausgeführt wird.
Dieser Schnipsel gehört in die VHost deiner Domain -- oder je nach Aufbau deines Django-Projekts auch in eine .htaccess Datei des entsprechenden Ordners:
# Voodoo-Engine starten
RewriteEngine On
#RewriteLog /path/to/rewrite.log
#RewriteLogLevel 9
# Prepend WWW
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^/(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
# Append Slash
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !.*/$
RewriteRule ^(.*)$ $1/ [R=301,L]
Nützlich ist dieser Schnipsel auch allen, die Djangos Flatpages einsetzen. Wenn der User eine URL besucht, die auf eine Flatpage zeigt, aber den Slash am Ende vergisst, bekommt er nur einen 404-NotFound Fehler zurück. Ein Bug der schon etwas länger diskutiert wird und hoffentlich in Zukunft auch gefixt wird. Einen Patch gibt es jedenfalls schon.