2012-02-01 89 views
4

我有一個Django電子商務網站正在運行,並已購買並安裝了SSL證書。Django從HTTPS重定向到HTTP

我添加了一個虛擬主機條目:

<VirtualHost *:443> 
     #Basic setup 
     ServerAdmin [email protected] 

     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版本,我得到其重定向到HTTP版本302標頭響應。

有在apache的conf沒有重定向明確狀態到端口80

我一直敲我的頭這一段時間,任何幫助將是巨大的!

謝謝

+0

重定向的cms/urls.py中是否有任何內容? – cubetwo1729 2012-02-01 22:18:55

+0

我們使用的是DjangoCMS-沒有任何內容.... – Simon 2012-02-02 09:48:22

回答

8

你可能已經固定它,它可能是一個完全不同的問題,但我只是碰到一些聽起來有點相似,因爲我沒有找到解決您的問題的答案,我想這可能是值得張貼答覆(儘管我有301和你302)。

我正在一個Django的網站(Django的1.6.1)背後nginx的gunicorn。所以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_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。

+3

設置SECURE_PROXY_SSL_HEADER爲我解決了這個問題。 – Nathan 2014-04-15 00:29:55

+0

我設置了'SECURE_PROXY_SSL_HEADER =('HTTP_X_FORWARDED_PROTO','https')',但是在某些情況下重定向到HTTP仍然會發生。我正在使用Django 1.6.5,並在AWS上部署負載平衡器,將「代理」HTTPS轉換爲非HTTPS。不幸的是,我需要'APPEND_SLASH'。 – jweyrich 2014-08-28 16:56:05

+0

如果您設置了HTTP_X_FORWARDED_PROTO並正確配置了Web服務器,它通常應該可以正常工作。也許負載平衡器亂七八糟的頭文件? – goetz 2014-09-04 13:39:46

0

只有我能想到的是你的網站設置在數據庫中。如果你在你的Site對象中加上一個明確的端口號......你可以看看你的管理員嗎?

0

我知道這是一個古老的問題,但我花了數小時尋找一個解決方案來解決相同的問題,所以我想我會發布我最終在這裏制定的。 我正在使用Satchmo作爲原始海報,它有一箇中間件類satchmo_store.shop.SSLMiddleware.SSLRedirect,默認情況下,它會按照原始問題中所述,使用302標題響應從https發送到http。在MIDDLEWARE_CLASSES中對該行進行註釋可以解決問題,如果有人希望完全通過https運行,但文檔http://satchmo.readthedocs.org/en/latest/configuration.html#ssl解釋瞭如何正確使用它,這是我將要嘗試執行的操作。