Forzar la administración Django a usar SSL

written by uve 22 May 2010

Django ofrece un panel de administración de forma automática. Voy a explicar brevemente como podemos forzar que todo lo que se realice a través del panel de administración vaya a través de una conexión segura: SSL.

Para ello vamos a hacer uso del módulo rewrite que ofrece Apache. Este módulo nos permite reescribir las peticiones antes de que se procesen. Esto se suele utilizar mucho en PHP para que la URI sea más bonita, cosa que en Django no es necesario.

Lo primero es activar mod_rewrite. Para ello:

$ sudo a2enmod
Your choices are: actions alias asis auth_basic auth_digest authn_alias authn_anon authn_dbd authn_dbm authn_default authn_file authnz_ldap authz_dbm authz_default authz_groupfile authz_host authz_owner authz_user autoindex cache cern_meta cgi cgid charset_lite dav dav_fs dav_lock dbd deflate dir disk_cache dump_io env expires ext_filter file_cache filter headers ident imagemap include info ldap log_forensic mem_cache mime mime_magic negotiation perl proxy proxy_ajp proxy_balancer proxy_connect proxy_ftp proxy_http proxy_scgi python reqtimeout rewrite setenvif speling ssl status substitute suexec unique_id userdir usertrack version vhost_alias
Which module(s) do you want to enable (wildcards ok)?
rewrite
Enabling module rewrite.
Run '/etc/init.d/apache2 restart' to activate new configuration!

Una vez tenemos los Virtual Hosts preparados para una conexión normal y una conexión segura, debemos añadir lo siguiente:

<VirtualHost *:80>
   ...
   RewriteEngine on
   RewriteRule ^/administration/(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

<VirtualHost *:443>
   ...
</VirtualHost>
Rewrite utiliza expresiones regulares para procesar la URI que se está solicitando. Para ello, el formato que se sigue es el siguiente
RewriteRule <patrón> <uri resultante> [modificadores]

De esta forma, cuando se procesa una URI, lo primero es buscar todas las expresiones regulares que coincidan con la expresión regular y aplicar las modificaciones oportunas. Además disponemos de los siguientes modificadores:

  • NC - No Case o Case Insensitive, o lo que es lo mismo, que no es sensible a mayúsculas y minúsculas.
  • R - Redirect. Indicamos que se va a realizar una redirección. Además podemos elegir el código a utilizar (entre 300 y 400). Por ejemplo, R=302
  • L - Last. Una vez que coincida una URI con la expresión regular de esta regla, ya no se procesarán el resto de reglas, es decir, será la última en procesarse.

Además disponemos de ^ y $ que nos indica que la expresión regular debe "empezar por" y "terminar por" respectivamente. Las expresiones regulares que se utilizan son bastante similares a las de Python, y por tanto a las de Django.

También disponemos de algunas variables

  • %{HTTP_HOST} : Nombre del host, por ejemplo, menudoproblema.es
  • %{REQUEST_URI} : Petición completa que se está procesando, por ejemplo, /noticias/26/
  • %{SERVER_PORT} : Puerto empleado en la petición

Y aunque de mod_rewrite se puede contar mucho más, de momento es suficiente con esto.

Tags

La teoría es cuando crees saber algo, pero no funciona.
La práctica es cuando algo funciona, pero no sabes por qué.
Los programadores combinan la teoría y la práctica:
Nada funciona y no saben por qué.