簡體   English   中英

Django正在從HTTPS重定向到HTTP

[英]Django is redirecting from HTTPS to HTTP

我有一個運行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.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

還有一個非ssl的conf,工作正常。

每當我請求網站的HTTPS版本時,我都會得到一個302頭響應,它會重定向到HTTP版本。

apache conf中沒有明確表示轉到端口80的重定向。

我一直在反對這一點,任何幫助都會很棒!

謝謝

你可能已經修好了它,這可能是一個完全不同的問題,但我只是聽到了一些聽起來有些類似的東西,而且我沒有找到解決你問題的答案,我認為發布回復可能是值得的(盡管我有301而你是302)。

我正在運行一個Django站點(Django 1.6.1),后面是nginx的gunicorn。 因此nginx執行SSL。 環境變量HTTPS設置為on

當我設置一個沒有http到https重定向的測試服務器時,我注意到有些請求最終被重定向到一個http地址 - 類似於你所描述的,但在我的情況下,它只是針對一個特定的鏈接。 在查看了請求和響應標頭之后,我發現:初始請求https://example.org/test被Django / gunicorn重定向, 301 MOVED PERMANENTLYhttp://exmaple.org/test/ 然后nginx以400 Bad Request - The plain HTTP request was sent to HTTPS port響應400 Bad Request - The plain HTTP request was sent to HTTPS port

我很快就遇到了一個我以前沒注意過的設置: APPEND_SLASHhttps://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_HEADERhttps://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的人。

我知道這是一個古老的問題,但我花了幾個小時尋找解決相同問題的解決方案,所以我想我會發布我最終在這里發布的內容。 我正在使用Satchmo作為原始海報,它有一個中間件類satchmo_store.shop.SSLMiddleware.SSLRedirect,它默認發送完全如原始問題中描述的重定向,從https到帶有302標題響應的http。 在MIDDLEWARE_CLASSES中注釋該行可以解決問題,如果有人想完全通過https運行,那么可能沒問題,但文檔http://satchmo.readthedocs.org/en/latest/configuration.html#ssl解釋了如何正確使用它,這是我將嘗試做什么。

我能想到的只是數據庫中的站點設置。 如果您在Site對象中放置了明確的端口號...您可以查看管理員嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM