8
votes

Comment rediriger domain.com à www.domain.com sous Django?

Comment faire de la redirection de toutes les demandes de domaine.com / ... à www .domain.com / ... avec un site de 301 dans un site Django?

Évidemment, cela ne peut pas être fait dans URLS.PY parce que vous obtenez uniquement la partie de chemin de l'URL.

Je ne peux pas utiliser mod de réécrire dans .htaccess, car .htaccess fichiers ne font rien sous Django (je pense).

Je suppose que quelque chose dans le middleware ou Apache Conf?

Je rencontre Django sur un serveur Linux avec Plesk, à l'aide de mod WSGI


2 commentaires

Qu'est-ce qui vous fait penser .htaccess ne fonctionne pas avec Django?


Je l'ai essayé. Mais le mod de la réécriture n'est pas mon point fort, il est donc probable que je me trompais probablement.


4 Réponses :


18
votes

La discussion de la ligne de plaisance indiquée est correcte en ce qui concerne la configuration, vous devez simplement l'appliquer vous-même plutôt que via un panneau de commande.

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)


6 commentaires

C'est un joli petit extrait de WSGI Slick. Certainement plus élégant que la chose que j'ai liée.


J'ai un peu trompé cependant. J'ai supposé que 'http' uniquement et je n'ai pas pris la peine de reconstruire l'URL complète et laissé cela jusqu'à le lecteur. Voulait montrer le concept plus que tout. Le middleware Django est plus correct. Dans l'ensemble, mod_rewrite devrait simplement être utilisé.


L'utilisation de la configuration Apache / LightPD / Nginx est plus efficace que d'utiliser Django pour ce travail.


Merci tout le monde! Exactement ce que je cherchais.


Pourquoi ne devrions-nous pas utiliser plutôt apache rediriger ? Stackoverflow.com/a/1100363/1161025


Redirection ne serait pas bon dans le cas où Exemple.com et www.example.com sont réellement traités dans le même virtualhost grâce à l'utilisation de ServerName et Serveralias. Redirection ne serait utile qu'à l'endroit où vous aviez séparé Virtualhost pour Exemple.com et www.example.com.



15
votes

the Prepend_www définir simplement cela.


1 commentaires

Ceci est utile, mais il convient de noter que c'est complètement indiscriminé ... il ajoutera toujours un site www s'il n'y en a pas un, donc pour un site également accessible de sous-domaines qui ne devraient pas commencer avec www, quelque chose comme les suggestions de Graham devient nécessaire.



1
votes

Cela peut également être fait avec un middleware.

Quelques exemples: P>

  • http://eikke.com/django-domain-redirect-middleware/ li>
  • https://djangosnippets.org/snippets/510/ li>
  • https://djangosnippets.org/snippets/434/ Li> ul>

    Ceci est une meilleure version de SNIPPET-510: P>

    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))
    


0 commentaires

4
votes

Il y a une manière légère de faire cela impliquant virtualhosts et mod_alias Directive de redirection . Vous pouvez définir deux virtualhosts, une tenant la redirection et une autre tenant le Configuration :

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

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


2 commentaires

Cela a fonctionné magnifiquement! Pourquoi plus de gens n'utilisent pas cette méthode ?? Y a-t-il une prise?


Tout le monde n'a pas accès à la configuration Apache, je pense que ce n'est que la limitation de l'utiliser.