2012-02-01 149 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解释了如何正确使用它,这是我将要尝试执行的操作。