Verzeichnisse nur über SSL erreichbar machen - und das benutzerfreundlich!

Die Anforderung:
Ein Verzeichnis auf einem Apache-Webserver (genauer das Admin-Frontend von Django) sollte nur via SSL erreichbar sein. Wenn jemand via HTTP auf (schützenswerte) Unterverzeichnisse zugreift, dann soll er "passend" umgleitet werden. Letztendlich kommt noch dazu, dass dieser Location-Container mit vielen anderen Einstellungen per Include-Anweisung in 2 virtuelle Hosts (HTTP und HTTPS) geladen wird. Für einige ist es OK, dass sie sowohl per HTTP als auch HTTPS ausgeliefert werden, für andere eben nicht. Da neben Django noch mehrere Tools auf diesem Web-Server laufen, gibt's dafür einen extra Location-Container:


SetHandler python-program
PythonHandler django.core.handlers.modpython
PythonPath "['/PFAD/ZUM/PROJECT/'] + sys.path"
PythonAutoReload On
SetEnv DJANGO_SETTINGS_MODULE PROJEKT.settings

Lösung 1:
Im Modul mod_ssl gibt es die Direktive SSLRequireSSL On, mit der man sicherstellen kann, dass es eben nur via SSL ausgeliefert wird.
Nachteil: Kommt ein Benutzer via HTTP bekommt er nur "Du kummst hier net rein!". Effektiv, aber nicht wirklich schön.


SetHandler python-program
PythonHandler django.core.handlers.modpython
PythonPath "['/PFAD/ZUM/PROJECT/'] + sys.path"
PythonAutoReload On
SetEnv DJANGO_SETTINGS_MODULE PROJEKT.settings

SSLRequireSSL On

Lösung 2:
Mit Hilfe von mod_rewrite bzw. dessen Direktiven RewriteCond und RewriteRule wird getestet, ob die Anfrage per HTTP kam und wenn ja an die selbe URL nur mit HTTPS weitergeleitet:


SetHandler python-program
PythonHandler django.core.handlers.modpython
PythonPath "['/PFAD/ZUM/PROJECT/'] + sys.path"
PythonAutoReload On
SetEnv DJANGO_SETTINGS_MODULE PROJEKT.settings

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}/%{REQUEST_URI}

Et voilà! ;-)