Невозможно выполнить перенаправление домена в Django с example.com на www.example.com

Когда я перехожу к example.com, я получаю следующее сообщение

500 - Internal Server Error

Когда я перехожу к www.example.com, я получаю сообщение об ошибке 404, которое означает, что мой сайт активен.

Как сделать перенаправление домена без .htaccess через Django с example.com на www.example.com?

Мой urls.py

     from django.conf.urls.defaults import *

     from django.contrib import admin
     admin.autodiscover()

     urlpatterns = patterns('',
     # Example:
     # (r'^{{ project_name }}/', include('{{ project_name }}.foo.urls')),

     (r'^home/', include('index.html')),

     # Uncomment the admin/doc line below and add 'django.contrib.admindocs' 
     # to INSTALLED_APPS to enable admin documentation:
     (r'^admin/doc/', include('django.contrib.admindocs.urls')),

     (r'^admin/(.*)', admin.site.root),
     )

[изменить]

У меня есть следующий ответ от Djangohosting:

Удалите прокси веб-сайта для [example.com] и добавьте [example.com] в раздел псевдонимов веб-сайта [www.example.com].

Я не совсем понимаю, что это значит.

  1. Как удалить прокси-сервер для example.com?
  2. Где найти раздел псевдонимов на сайте www.example.com?

person Léo Léopold Hertz 준영    schedule 12.04.2009    source источник
comment
Почему вы не можете использовать .htaccess (или любой другой механизм, предоставляемый веб-сервером, который вы можете использовать)?   -  person mipadi    schedule 12.04.2009
comment
@mipadi: Я могу, но не хочу. Я хочу научиться настраивать свой сайт без .htaccess. Один сказал мне, что .htaccess, полный конфигураций, является признаком плохой безопасности в Apache.   -  person Léo Léopold Hertz 준영    schedule 12.04.2009
comment
Вообще говоря, Django не занимается конфигурациями серверов - по крайней мере, в этой ситуации. Приложение Django обслуживается с сервера. Поэтому, если вы хотите автоматически перенаправлять с site.com на www.site.com, лучше всего это сделать с помощью какого-либо файла конфигурации Apache.   -  person mipadi    schedule 12.04.2009


Ответы (4)


Я не знаю, решит ли он все ваши проблемы, но если вы хотите сделать это через django, попробуйте промежуточное ПО

from django.http import HttpResponseRedirect

class WWWRedirectMiddleware(object):
    def process_request(self, request):
        if not request.META['HTTP_HOST'].startswith('www.'):
            return HttpResponseRedirect('http://www.example.com')

Помните, что он должен выполняться перед любым другим промежуточным программным обеспечением.

На основе этого, не тестировал.

person zalew    schedule 13.04.2009

Может помочь проверка настройки PREPEND_WWW.

person utku_karatas    schedule 12.04.2009
comment
Проблема в том, что вы не сможете найти сайт, на котором будет работать параметр prepend_www. :-) - person Jason Baker; 12.04.2009

Ошибка 500 Internal Server, вероятно, вызвана этой строкой:

(r'^home/', include('index.html')),

Функция include() - это способ включения других файлов конфигурации URL, а не статических файлов HTML. Вам нужно будет либо использовать index.html как статический file по заданному URL (/ home) или напишите представление, которое просто отображает файл.

person mipadi    schedule 12.04.2009
comment
Я закомментировал строку. Возникает та же ошибка. @mipadi: Спасибо, что указали на это! - person Léo Léopold Hertz 준영; 12.04.2009

Когда я перехожу к example.com, я получаю следующее сообщение

внутренняя ошибка сервера 500

Когда я перехожу к www.example.com, я получаю сообщение об ошибке 404, что означает, что мой сайт активен.

Скорее всего, наоборот. Сообщение 500 означает, что ваш сайт активен, но выдает ошибку. Вы должны понимать, что часть _3 _ / _ 4_ URL-адреса служит для поиска к какому серверу подключиться. К тому времени, когда ваше приложение Django будет вызвано, эта часть уже будет завершена, поэтому сделать это из Django невозможно.

Вместо этого вы хотите настроить www как поддомен example.com и сделать так, чтобы они указывали на одно и то же место. См. Первый пример здесь: примеры виртуальных хостов

ОБНОВЛЕНИЕ. Я только что заметил, что вы указали, что показывается ваш 404, поэтому игнорируйте первые два предложения. В любом случае решение, скорее всего, будет таким же. :-)

person Jason Baker    schedule 12.04.2009