2010-02-18 4 views
8

Wie gehe ich vor, alle Anfragen für domain.com/... auf www .domain.com/... mit einem 301 in einer Django-Site umzuleiten?Wie leite ich domain.com auf WWW.domain.com unter Django um?

Offensichtlich kann dies nicht in urls.py getan werden, weil Sie nur den Pfad Teil der URL dort bekommen.

Ich kann mod nicht in .htaccess überschreiben, weil .htaccess-Dateien nichts unter Django tun (glaube ich).

Ich rate etwas in Middleware oder Apache conf?

Ich bin mit Django auf einem Linux-Server mit Plesk, Mod_wsgi

+0

Was Sie denken macht. htaccess funktioniert nicht mit Django? –

+0

Ich habe es ausprobiert. Aber Mod Rewrite ist nicht meine Stärke, also habe ich es wahrscheinlich falsch gemacht. – Jake

Antwort

18

Die WebFaction Diskussion jemand darauf besteht, so weit wie die Konfiguration korrekt ist out, Sie müssen es nur selbst anwenden, anstatt über ein Bedienfeld.

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

In .htaccess-Datei oder in Haupt-Apache-Konfiguration in entsprechenden Kontext. Wenn Sie sich in einem VirtualHost in der Apache-Hauptkonfiguration befinden, lautet Ihr Servername www.example.com und ServerAlias ​​ist example.com, um sicherzustellen, dass der virtuelle Host beide Anforderungen verarbeitet.

Wenn Sie keinen Zugriff auf eine Apache-Konfiguration haben, können Sie bei Bedarf einen WSGI-Wrapper für den Django WSGI-Anwendungspunkt verwenden. Etwas wie:

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) 

diese Fixierung auf die URL innerhalb der Website zu schließen und den Umgang mit https wird dem Leser als Übung überlassen. :-)

+0

Das ist ein ziemlich schickes kleines WSGI-Snippet. Definitiv eleganter als das, was ich verlinkt habe. – jathanism

+1

Ich habe ein bisschen betrogen. Ich habe nur "http" angenommen und mich nicht damit beschäftigt, die vollständige URL zu rekonstruieren, und habe das dem Leser überlassen. Wollte das Konzept mehr als alles andere zeigen. Die Django-Middleware ist korrekter. Insgesamt sollte mod_rewrite einfach verwendet werden. –

+1

Die Verwendung der Apache/Lighttpd/nginx-Konfiguration ist effizienter als die Verwendung von django für diese Arbeit. – jujule

0

Ein voller Thread zu dem Thema mit hier http://forum.webfaction.com/viewtopic.php?id=1516

+0

Dieser Thread bezieht sich auf eine Systemsteuerung, die ich nicht habe. Es gibt einen Link zu den Django-Dokumenten für PREPEND_WWW, das ist das Verhalten, das ich brauche, aber ich würde eine 301-Weiterleitung bevorzugen. – Jake

+0

Link-Only-Antworten sind nicht gut, weil sie die Antwort nicht enthalten und der Link kann veralten. – Flimm

15

Die Einstellung PREPEND_WWW macht genau das.

+4

Dies ist nützlich, aber es ist erwähnenswert, dass es völlig unterschiedslos ist ... es wird immer ein www hinzufügen, wenn es keins gibt, also für eine Seite, die auch von Subdomains aus zugänglich ist, die nicht mit www beginnen sollten, etwas wie Grahams Vorschläge wird notwendig. – kungphu

0

Dies kann auch mit einer Middleware erfolgen.

Einige Beispiele:

Dies ist eine bessere Version des Schnipsel-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)) 
3

Es gibt a better way to do that. Sie sollten nur in Apache-Konfiguration Ihre default VirtualHost einem anderen hinzuzufügen, die wie folgt definiert werden:

<VirtualHost *:80> 
    ServerName domain.com 
    Redirect permanent/http://www.domain.com/ 
</VirtualHost> 

Und das wird die Arbeit machen.

0

Ich habe Grahams Lösung versucht, aber kann es nicht funktionieren (auch wenn der einfachste Fall von http (nicht HTTPS) ohne Pfad. Ich bin nicht mit Wsgi erfahren, wie Sie wahrscheinlich erraten und alle Hilfe ist sehr geschätzt

Hier ist mein Versuch (Umleitung von www.olddomain.com zu www.newdomain.com).Wenn ich versuche, es zu implementieren, versuchen www.olddomain.com führt zu einem Fehler zu erreichen („Kann diese Seite nicht erreichen“):

from django.core.wsgi import get_wsgi_application 

_application = get_wsgi_application() 

def application(environ, start_response): 
    if environ['HTTP_HOST'][:21] == 'www.olddomain.com': 
    start_response('301 Redirect', [('Location', 'http://www.newdomain.com/'),]) 
    return [] 

    return _application(environ, start_response) 

Danke für Ihre Hilfe

Verwandte Themen