Django está redirigiendo de HTTPS a HTTP

Tengo un sitio de comercio electrónico Django en ejecución, tengo compras e instalé un certificado SSL para él.

He agregado una entrada de 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>

Aquí está el archivo urls.py:

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

También hay una configuración para no ssl que funciona bien.

Siempre que solicito la versión HTTPS del sitio, obtengo una respuesta de encabezado 302 que redirige a la versión HTTP.

No hay redirecciones en la configuración de apache que indiquen explícitamente que van al puerto 80.

Me he estado golpeando la cabeza contra esto por un tiempo, ¡cualquier ayuda sería genial!

Muchas Gracias

preguntado el 01 de febrero de 12 a las 14:02

¿Hay algo en cms / urls.py que redireccione? -

Estamos usando DjangoCMS, no hay nada allí ....

3 Respuestas

Probablemente ya lo solucionó y podría ser un problema completamente diferente, pero me encontré con algo que suena algo similar y como no encontré una respuesta que abordara su problema, pensé que podría valer la pena publicar una respuesta (a pesar de que estaba teniendo un 301 y usted un 302).

Estoy ejecutando un sitio de Django (Django 1.6.1) con gunicorn detrás de nginx. Entonces nginx hace el SSL. La variable de entorno HTTPS se establece a on.

Cuando configuré un servidor de prueba sin un redireccionamiento de http a https, noté que algunas solicitudes terminan siendo redirigidas a una dirección http, similar a lo que describe, pero en mi caso fue solo para un enlace en particular. Después de buscar en los encabezados de solicitud y respuesta, descubrí: La solicitud inicial https://example.org/test fue redirigido por Django / gunicorn con 301 MOVED PERMANENTLY a http://exmaple.org/test/. nginx luego respondió con 400 Bad Request - The plain HTTP request was sent to HTTPS port.

Rápidamente me encontré con un escenario al que no había prestado mucha atención antes: APPEND_SLASH (https://docs.djangoproject.com/en/1.6/ref/settings/#std:setting-APPEND_SLASH) con el valor predeterminado True.

Después de agregar APPEND_SLASH = False a mi settings.py archivo, una solicitud a https://example.org/test resultó en un 404 NOT FOUND respuesta, sin una redirección a http. Entonces parece que APPEND_SLASH no respeta el HTTP configuración de la variable de entorno - supongo que configurar SECURE_PROXY_SSL_HEADER (https://docs.djangoproject.com/en/1.6/ref/settings/#std:setting-SECURE_PROXY_SSL_HEADER) resolvería esto, todavía no lo he probado.

Por cierto, la razón de ese enlace "defectuoso" en mi caso fue un enlace codificado en una plantilla. La forma más sencilla de evitar enlaces como ese es utilizando el {% url ... %} etiqueta de plantillahttps://docs.djangoproject.com/en/1.6/ref/templates/builtins/#url [lo siento, no pude hacer clic en este enlace porque no tengo "al menos 10 reputación" ...]).

Quizás esto le ayude a usted oa cualquier otra persona que se pregunte por qué Django a veces redirige de https a http.

Respondido el 20 de enero de 14 a las 14:01

La configuración de SECURE_PROXY_SSL_HEADER solucionó esto para mí. - Nathan

lo puse SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https'), pero la redirección a HTTP todavía ocurre en algunos casos. Estoy usando Django 1.6.5 y lo estoy implementando en AWS detrás de un equilibrador de carga que "transfiere" HTTPS a no HTTPS. necesito APPEND_SLASH, Desafortunadamente. - jweyrich

Si configura HTTP_X_FORWARDED_PROTO y configuró su servidor web correctamente, normalmente debería funcionar. ¿Quizás el equilibrador de carga se mete con los encabezados? - goetz

Sé que esta es una pregunta antigua, pero acabo de pasar horas buscando una solución a un problema idéntico, así que pensé en publicar lo que finalmente resolví aquí. Estaba usando Satchmo como estaba el póster original, tiene una clase de middleware satchmo_store.shop.SSLMiddleware.SSLRedirect que, de forma predeterminada, envía una redirección exactamente como se describe en la pregunta original de https a http con una respuesta de encabezado 302. Comentar la línea en MIDDLEWARE_CLASSES soluciona el problema y puede estar bien si alguien quiere ejecutar completamente https pero la documentación http://satchmo.readthedocs.org/en/latest/configuration.html#ssl explica cómo usarlo correctamente, que es lo que voy a intentar hacer.

Respondido 19 Jul 15, 16:07

Lo único que se me ocurre es la configuración de su sitio en la base de datos. Si pones un número de puerto explícito en tu Site objeto ... ¿Podrías echar un vistazo a tu administrador?

respondido 22 mar '12, 04:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.