Django正在从HTTPS重定向到HTTP

Sim*_*mon 4 sysadmin apache django ssl https

我有一个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>
Run Code Online (Sandbox Code Playgroud)

这是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
Run Code Online (Sandbox Code Playgroud)

还有一个非ssl的conf,工作正常.

每当我请求网站的HTTPS版本时,我都会得到一个302头响应,它会重定向到HTTP版本.

apache conf中没有明确表示转到端口80的重定向.

我一直在反对这一点,任何帮助都会很棒!

谢谢

goe*_*etz 7

你可能已经修好了它,这可能是一个完全不同的问题,但我只是听到了一些听起来有些类似的东西,而且我没有找到解决你问题的答案,我认为发布回复可能是值得的(尽管我有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.

很快我遇到了一个我以前没注意过的设置:APPEND_SLASH(https://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_HEADER(https://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的人.

  • 设置SECURE_PROXY_SSL_HEADER为我修复了这个问题. (3认同)