2009-09-21 3 views
1

Всякий раз, когда мой сайт django вызывает «HttpResponseRedirect» в объекте представления для перенаправления на другой URL-адрес, он удаляет субдомен и возвращается к основному сайту. Я работаю в ветке SVN Django. Вот пример:
HttpResponseRedirect Django, похоже, удаляет мой поддомен?

 
#Request comes in as https://sub1.mydomain.com 
def view(request): 
    return HttpResponseRedirect("/test_url") #The browser will actually get redirected to https://mydomain.com/test_url 


Есть ли причина, это делается? Должен ли я перенаправить на полный путь, включая поддомен?

ответ

4

В Django есть методы, которые всегда применяются для ответа. Один из них - django.http.utils.fix_location_header. Это гарантирует, что ответ перенаправления всегда содержит абсолютный URI (как требуется спецификацией HTTP).

Этот метод использует request.build_absolute_uri, который в свою очередь использует request.get_host. get_host пытается получить HTTP_HOST от request.META, возвращаясь к использованию SERVER_NAME.

Я полагаю, что ваш сервер не предоставляет HTTP_HOST и что для вашего SERVER_NAME установлено значение mydomain.com.

Надеюсь, теперь вы знаете, что ищете, вы можете запустить некоторые тесты, чтобы понять, что происходит не так.

+2

FYI, этот ответ также полезен для устранения неполадок «почему Джанго иногда перенаправляя от HTTPS к HTTP?» (например, после формы входа). Если ваш сервер или обратный прокси не предоставляют Django точный 'request.is_secure', тогда' fix_location_header' неправильно отобразит схему, когда она сделает абсолютное перенаправление. – medmunds

+0

@medmunds У меня есть именно эта проблема, django перенаправляет с https на http при переадресации с относительного URL. Какими заголовками http должен быть установлен сервер/прокси, чтобы решить проблему? – thedk

+1

@thedk это будет что-то вроде X-Forwarded-Proto или X-Forwarded-SSL - и вам нужно будет рассказать Django об этом. Взгляните на SECURE_PROXY_SSL_HEADER в https://docs.djangoproject.com/en/1.4/ref/settings/#secure-proxy-ssl-header (и серьезно относитесь к предупреждению о безопасности). Кроме того, поиск «django request.is_secure» будет включать некоторые другие решения до 1.4. – medmunds

2

HttpResponseRedirect просто вернет код состояния 302 с помощью набора заголовков местоположения. Уравновешитель URL не учитывает субдомен (см. http://code.djangoproject.com/ticket/8896). Лучше всего либо восстановить его с нуля (HTTP_HOST на META), либо просто использовать Middleware от http://thingsilearned.com/2009/01/05/using-subdomains-in-django/.

Приветствия

Смежные вопросы