4 votes

Django redirige de HTTPS à HTTP

J'ai un site de commerce électronique Django qui fonctionne, et j'ai acheté et installé un certificat SSL pour lui.

J'ai ajouté une entrée 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>

Voici le fichier 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

Il y a aussi une conf pour non ssl qui fonctionne bien.

Chaque fois que je demande la version HTTPS du site, j'obtiens un en-tête 302 qui redirige vers la version HTTP.

Il n'y a pas de redirection dans le conf d'Apache qui indique explicitement d'aller sur le port 80.

Cela fait un moment que je me heurte à ce problème, toute aide serait la bienvenue !

Remerciements

7voto

goetz Points 503

Vous l'avez probablement déjà résolu et il pourrait s'agir d'un problème totalement différent, mais je viens de tomber sur quelque chose qui semble assez similaire et comme je n'ai pas trouvé de réponse à votre problème, j'ai pensé que cela valait la peine de poster une réponse (même si j'avais un 301 et vous un 302).

Je fais tourner un site Django (Django 1.6.1) avec gunicorn derrière nginx. C'est donc nginx qui s'occupe du SSL. La variable d'environnement HTTPS est fixé à on .

Lorsque j'ai mis en place un serveur de test sans redirection http-to-https, j'ai remarqué que certaines requêtes étaient redirigées vers une adresse http - similaire à ce que vous décrivez, mais dans mon cas, c'était juste pour un lien particulier. Après avoir examiné les en-têtes de la requête et de la réponse, j'ai trouvé ce qui suit : La requête initiale https://example.org/test a été redirigé par Django/gunicorn avec 301 MOVED PERMANENTLY à http://exmaple.org/test/ . nginx a alors répondu par 400 Bad Request - The plain HTTP request was sent to HTTPS port .

Rapidement, je suis tombé sur un paramètre auquel je n'avais pas prêté attention auparavant : APPEND_SLASH ( https://docs.djangoproject.com/en/1.6/ref/settings/#std:setting-APPEND_SLASH ) avec la valeur par défaut True .

Après avoir ajouté APPEND_SLASH = False à mon settings.py une demande à l'adresse https://example.org/test a donné lieu à une 404 NOT FOUND sans redirection vers http. Il semble donc que APPEND_SLASH ne respecte pas la HTTP paramètre de la variable d'environnement - je suppose que la configuration SECURE_PROXY_SSL_HEADER ( https://docs.djangoproject.com/en/1.6/ref/settings/#std:setting-SECURE_PROXY_SSL_HEADER ) pourrait résoudre ce problème, mais je ne l'ai pas encore testé.

D'ailleurs, la raison de ce lien "défectueux" dans mon cas était un lien codé en dur dans un modèle. La manière la plus simple d'éviter ce type de lien est d'utiliser la fonction intégrée {% url ... %} modèle de balise ( https://docs.djangoproject.com/en/1.6/ref/templates/builtins/#url [désolé, je n'ai pas pu rendre ce lien cliquable parce que je n'ai pas "au moins 10 de réputation"...]).

Peut-être que cela vous aidera, vous ou toute autre personne qui se demande pourquoi Django redirige parfois de https à http.

1voto

Dan-Dev Points 212

Je sais que c'est une vieille question mais je viens de passer des heures à chercher une solution à un problème identique et j'ai donc pensé poster ici ce que j'ai fini par trouver. J'utilisais Satchmo comme le post original, il a une classe middleware satchmo_store.shop.SSLMiddleware.SSLRedirect qui par défaut envoie une redirection exactement comme décrit dans la question originale de https à http avec une réponse d'en-tête 302. Commenter la ligne dans MIDDLEWARE_CLASSES résout le problème et peut être OK si quelqu'un veut fonctionner complètement sur https mais la documentation http://satchmo.readthedocs.org/en/latest/configuration.html#ssl explique comment l'utiliser correctement, ce que je vais essayer de faire.

0voto

Reinout van Rees Points 5483

La seule chose à laquelle je peux penser est la configuration de votre site dans la base de données. Si vous mettez un numéro de port explicite dans votre Site objet... Pourriez-vous jeter un coup d'œil dans votre administration ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X