57 lines
1.7 KiB
Python
57 lines
1.7 KiB
Python
import re
|
|
import warnings
|
|
|
|
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. """
|
|
|
|
response_redirect_class = http.HttpResponsePermanentRedirect
|
|
|
|
def process_request(self, request):
|
|
"""
|
|
Rewrite the URL based on settings.UNPREPEND_WWW
|
|
"""
|
|
|
|
unprepend_www = getattr(settings, "UNPREPEND_WWW", False)
|
|
|
|
if not unprepend_www:
|
|
return
|
|
|
|
# Check for a redirect based on settings.UNPREPEND_WWW
|
|
host = request.get_host()
|
|
must_unprepend = unprepend_www and host and host.lower().startswith('www.')
|
|
wwwless_host = host[4:]
|
|
redirect_url = ('%s://%s' % (request.scheme, wwwless_host)) if must_unprepend else ''
|
|
|
|
path = request.get_full_path()
|
|
|
|
# Return a redirect if necessary
|
|
if redirect_url or path != request.get_full_path():
|
|
redirect_url += path
|
|
return self.response_redirect_class(redirect_url)
|