Как перенаправить domain.com на WWW.domain.com под Django? - PullRequest
8 голосов
/ 18 февраля 2010

Как мне перенаправить все запросы на domain.com / ... на www .domain.com / ... с 301 на сайте django?

Очевидно, что это не может быть сделано в urls.py, потому что вы получаете только часть пути URL там.

Я не могу использовать переписывание модов в .htaccess, потому что файлы .htaccess ничего не делают под Django (я думаю).

Я предполагаю, что-то в middleware или apache conf?

Я запускаю Django на сервере Linux с Plesk, используя мод WSGI

Ответы [ 6 ]

18 голосов
/ 18 февраля 2010

Обсуждение WebFaction, на которое указал кто-то, является верным в том, что касается конфигурации, вам просто нужно применить ее самостоятельно, а не через панель управления.

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

Поместите в файл .htaccess или в основную конфигурацию Apache в соответствующем контексте. Если внутри VirtualHost в основной конфигурации Apache, ServerName будет www.example.com, а ServerAlias ​​- example.com, чтобы виртуальный хост обрабатывал оба запроса.

Если у вас нет доступа к какой-либо конфигурации Apache, при необходимости это можно сделать с помощью оболочки WSGI вокруг точки входа приложения Django WSGI. Что-то вроде:

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)

Исправление, включающее URL-адрес на сайте и работу с https, оставлено читателю в качестве упражнения. : -)

15 голосов
/ 18 февраля 2010

Настройка PREPEND_WWW делает именно это.

3 голосов
/ 04 декабря 2015

Существует легкий способ сделать это , включающий VirtualHosts и mod_alias Директива Redirect .Вы можете определить два виртуальных хоста, один из которых содержит перенаправление, а другой - конфигурацию сайта :

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

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

И это выполнит эту работу.

0 голосов
/ 12 июня 2016

Я попробовал решение Грэма, но не могу заставить его работать (даже если простейший случай http (не https) без какого-либо пути. У меня нет опыта работы с wsgi, как вы можете догадаться, и вся помощь глубоко оценены.

Вот моя попытка (перенаправление с www.olddomain.com на www.newdomain.com). Когда я пытаюсь развернуть его, попытка связаться с www.olddomain.com приводит к ошибке («Не удается перейти на эту страницу»):

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)

Спасибо за вашу помощь

0 голосов
/ 19 апреля 2015

Это также можно сделать с помощью промежуточного программного обеспечения.

Некоторые примеры:

Это лучшая версия 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))
0 голосов
/ 18 февраля 2010

Полная информация о проблеме существует здесь http://forum.webfaction.com/viewtopic.php?id=1516

...