diff --git a/pinaxcon/middleware.py b/pinaxcon/middleware.py index f0a60b0..b70e96a 100644 --- a/pinaxcon/middleware.py +++ b/pinaxcon/middleware.py @@ -5,6 +5,29 @@ from django import http from django.conf import settings from django.utils.deprecation import MiddlewareMixin +class CanonicalHostMiddleware(MiddlewareMixin): + """ Redirects to a canonical host if the current host is not the canonical + host. """ + + response_redirect_class = http.HttpResponsePermanentRedirect + + def process_request(self, request): + + canonical_host = getattr(settings, "CANONICAL_HOST", None) + + if not canonical_host: + return + + host = request.get_host() + + if host == canonical_host: + return + + path = request.get_full_path() + redirect_url = ('%s://%s%s' % (request.scheme, canonical_host, path)) + return self.response_redirect_class(redirect_url) + + class UnprependWWWMiddleware(MiddlewareMixin): """ Unprepends www if necessary. """ diff --git a/pinaxcon/settings.py b/pinaxcon/settings.py index d568f71..f76a65d 100644 --- a/pinaxcon/settings.py +++ b/pinaxcon/settings.py @@ -23,6 +23,7 @@ db_from_env = dj_database_url.config() DATABASES['default'].update(db_from_env) ALLOWED_HOSTS = [".localhost", ".herokuapp.com", ".northbaypython.org"] +CANONICAL_HOST = os.environ.get("DJANGO_CANONICAL_HOST", None) # Local time zone for this installation. Choices can be found here: # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name @@ -134,8 +135,8 @@ MIDDLEWARE_CLASSES = [ "reversion.middleware.RevisionMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", "ssl_redirect.middleware.SSLRedirectMiddleware", + "pinaxcon.middleware.CanonicalHostMiddleware", "pinaxcon.middleware.UnprependWWWMiddleware", - ] ROOT_URLCONF = "pinaxcon.urls"