Django перенаправляет с HTTPS на HTTP - PullRequest
4 голосов
/ 01 февраля 2012

У меня работает сайт электронной торговли Django, и я приобрел и установил для него сертификат SSL.

Я добавил запись VirtualHost:

<VirtualHost *:443>
        #Basic setup
        ServerAdmin blah@test.com

        ServerName test.com
        ServerAlias www.test.com

        Alias /media/admin/ /home/test/public_html/test/release/env/lib/python2.6/dist-packages/django/contrib/admin/media/
        Alias /static/ /home/test/public_html/test/release/static/
        Alias /media/ /home/test/public_html/test/release/media/

        <Directory /home/test/public_html/test/release/>
            Order deny,allow
            Allow from all
        </Directory>
        RewriteEngine On

        LogLevel warn
        ErrorLog  /home/test/public_html/test/logs/error.log
        CustomLog /home/test/public_html/test/logs/access.log combined

        WSGIDaemonProcess test user=www-data group=www-data threads=20 processes=2
        WSGIProcessGroup test_ssl

        WSGIScriptAlias / /home/test/public_html/test/release/apache/test.wsgi

        SSLEngine On
        SSLCertificateFile /etc/apache2/ssl/test.com.crt
        SSLCertificateChainFile /etc/apache2/ssl/gs_root.pem
        SSLCertificateKeyFile /etc/apache2/ssl/www.test.com.key
</VirtualHost>

Вот urls.pyfile:

from django.conf.urls.defaults import patterns, include, url
from django.contrib import admin
from django.conf import settings

from gallery.models import LOCATIONS, Photo

admin.autodiscover()

from satchmo_store.urls import urlpatterns as satchmo_urls

from satchmo_store.shop.views.sitemaps import sitemaps
from cms.sitemaps import CMSSitemap
sitemaps['pages'] = CMSSitemap

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^search/', include('haystack.urls')),

    # Include satchmo urls. Unfortunately, this also includes it's own
    # /admin/ and everything else.
    url(r'^shop/', include(satchmo_urls)), 
    url(r'^sitemap\.xml/?$', 'django.contrib.sitemaps.views.sitemap', {'sitemaps': sitemaps}),

    url(r'events/gallery/(.*)/(.*)/$', 'gallery.views.events_image'),
    url(r'locations/view-all/(.*)/$', 'gallery.views.locations_image'),
    url(r'locations/view-all/$', 'gallery.views.locations_view_all',{
            'queryset':Photo.objects.filter(gallery__category=LOCATIONS).distinct()}),
    url(r'^contact-us/', include('contact_form.urls')),
    url(r'^', include('cms.urls')),
)

if settings.DEBUG:
    urlpatterns = patterns('',
        (r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),
        (r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_ROOT}),
        (r'^404/$', 'django.views.defaults.page_not_found'),
        (r'^500/$', 'django.views.defaults.server_error'),
    ) + urlpatterns

Существует также конф для non ssl, который работает нормально.

Всякий раз, когда я запрашиваю HTTPS-версию сайта, я получаю ответ заголовка 302, который перенаправляет наВерсия HTTP.

В apache conf нет перенаправлений, которые явно указывают на порт 80.

Я какое-то время бился с этим, любая помощь была бы великолепна!

Спасибо

Ответы [ 3 ]

7 голосов
/ 20 января 2014

Вы, наверное, уже исправили это, и это может быть совсем другая проблема, но я только что наткнулся на что-то, что звучит несколько схоже, и, поскольку я не нашел ответа, касающегося вашей проблемы, я подумал, что может быть стоит опубликовать ответ(несмотря на то, что у меня 301, а у вас 302).

Я управляю сайтом Django (Django 1.6.1) с gunicorn за nginx.Так что nginx делает SSL.Переменная среды HTTPS установлена ​​на on.

Когда я настроил тестовый сервер без перенаправления http-to-https, я заметил, что некоторые запросы в конечном итоге перенаправляются на адрес http - аналогичнок тому, что вы описываете, но в моем случае это было только для одной конкретной ссылки.Изучив заголовки запроса и ответа, я обнаружил: Первоначальный запрос https://example.org/test был перенаправлен Django / gunicorn с 301 MOVED PERMANENTLY на http://exmaple.org/test/.Затем nginx ответил 400 Bad Request - The plain HTTP request was sent to HTTPS port.

Быстро я наткнулся на настройку, на которую раньше не обращал особого внимания: APPEND_SLASH (https://docs.djangoproject.com/en/1.6/ref/settings/#std:setting-APPEND_SLASH) со значением по умолчанию True.

После добавления APPEND_SLASH = Falseк моему settings.py файлу запрос к https://example.org/test привел к ответу 404 NOT FOUND, без перенаправления на http. Поэтому кажется, что APPEND_SLASH не соответствует настройке переменной окружения HTTP - думаю, настройка SECURE_PROXY_SSL_HEADER (https://docs.djangoproject.com/en/1.6/ref/settings/#std:setting-SECURE_PROXY_SSL_HEADER) это решило бы, я еще не проверял.

Кстати, причиной этой "неисправной" ссылки в моем случае была жестко закодированная ссылка в шаблоне.Самый простой способ избежать подобных ссылок - использовать встроенный тег шаблона {% url ... %} (https://docs.djangoproject.com/en/1.6/ref/templates/builtins/#url [извините, я не могу сделать эту ссылку кликабельной, потому что у меня нет «по крайней мере 10 репутации» ...]).

Возможно, это поможет вам или кому-то еще, кто задается вопросом, почему Django иногда перенаправляет с https на http.

1 голос
/ 19 июля 2015

Я знаю, что это старый вопрос, но я потратил часы на поиск решения идентичной проблемы, поэтому я подумал, что опубликую то, что я в итоге разработал здесь. Я использовал Satchmo в качестве оригинального плаката. Он имеет класс промежуточного программного обеспечения satchmo_store.shop.SSLMiddleware.SSLRedirect, который по умолчанию отправляет перенаправление точно так, как описано в исходном вопросе, с https на http с ответом заголовка 302. Комментирование строки в MIDDLEWARE_CLASSES устраняет проблему и может быть нормальным, если кто-то хочет полностью запустить HTTPS, но документация http://satchmo.readthedocs.org/en/latest/configuration.html#ssl объясняет, как правильно его использовать, что я и собираюсь попробовать.

0 голосов
/ 22 марта 2012

Единственное, о чем я могу думать, это настройки вашего сайта в базе данных.Если вы указали явный номер порта в вашем Site объекте ... Не могли бы вы взглянуть на вашего администратора?

...