skip to Main Content

How do I go about redirecting all requests for domain.com/… to www.domain.com/… with a 301 in a django site?

Obviously this can’t be done in urls.py because you only get the path part of the URL in there.

I can’t use mod rewrite in .htaccess, because .htaccess files do nothing under Django (I think).

I’m guessing something in middleware or apache conf?

I’m running Django on a Linux server with Plesk, using mod WSGI

4

Answers


  1. The WebFaction discussion someone pointed out is correct as far as the configuration, you just have to apply it yourself rather than through a control panel.

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^example.com$
    RewriteRule (.*) http://www.example.com/$1 [R=301,L]
    

    Put in .htaccess file, or in main Apache configuration in appropriate context. If inside of a VirtualHost in main Apache configuration, your would have ServerName be http://www.example.com and ServerAlias be example.com to ensure that virtual host handled both requests.

    If you don’t have access to any Apache configuration, if need be, it can be done using a WSGI wrapper around the Django WSGI application entry point. Something like:

    import django.core.handlers.wsgi
    _application = django.core.handlers.wsgi.WSGIHandler()
    
    def application(environ, start_response):
      if environ['HTTP_HOST'] != 'www.example.com':
        start_response('301 Redirect', [('Location', 'http://www.example.com/'),])
        return []
      return _application(environ, start_response)
    

    Fixing this up to include the URL within the site and dealing with https is left as an exercise for the reader. 🙂

    Login or Signup to reply.
  2. The PREPEND_WWW setting does just that.

    Login or Signup to reply.
  3. This also can be done with a middleware.

    Some examples:

    This is a better version of snippet-510:

    class UrlRedirectMiddleware(object):
        """
        This middleware lets you match a specific url and redirect the request to a
        new url. You keep a tuple of (regex pattern, redirect) tuples on your site
        settings, example:
    
        URL_REDIRECTS = (
            (r'(https?)://(www.)?sample.com/(.*)$', r'1://example.com/3'),
        )
        """
        def process_request(self, request):
            full_url = request.build_absolute_uri()
            for url_pattern, redirect in settings.URL_REDIRECTS:
                match = re.match(url_pattern, full_url)
                if match:
                    return HttpResponsePermanentRedirect(match.expand(redirect))
    
    Login or Signup to reply.
  4. There is a lightweight way to do that involving VirtualHosts and mod_alias Redirect directive. You can define two VirtualHosts, one holding the redirect and another holding the site configuration:

    <VirtualHost *:80>
        ServerName example.com
        Redirect permanent / http://www.example.com/
    </VirtualHost>
    
    <VirtualHost *:80>
        ServerName www.example.com
        # real site configuration
    </VirtualHost>
    

    And that will do the job.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search