简体   繁体   English

Django正在从HTTPS重定向到HTTP

[英]Django is redirecting from HTTPS to HTTP

I have a Django ecommerce site running, and have purchases and installed an SSL cert for it. 我有一个运行Django电子商务网站,并购买并安装了SSL证书。

I have added a VirtualHost entry: 我添加了一个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>

Here is the urls.py file: 这是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

There is also a conf for non ssl which is working fine. 还有一个非ssl的conf,工作正常。

Whenever I request the HTTPS version of the site, I get a 302 header response which redirects to the HTTP version. 每当我请求网站的HTTPS版本时,我都会得到一个302头响应,它会重定向到HTTP版本。

There are no redirects in the apache conf that explicitly state go to port 80. apache conf中没有明确表示转到端口80的重定向。

Ive been banging my head against this for a while, any help would be great! 我一直在反对这一点,任何帮助都会很棒!

Thanks 谢谢

You probably already fixed it and it could be an entirely different problem, but I just came across something that sounds somewhat similar and as I did not find an answer that addressed your issue, I thought it might be worth to post a reply (despite I was having a 301 and you a 302). 你可能已经修好了它,这可能是一个完全不同的问题,但我只是听到了一些听起来有些类似的东西,而且我没有找到解决你问题的答案,我认为发布回复可能是值得的(尽管我有301而你是302)。

I am running a Django site (Django 1.6.1) with gunicorn behind nginx. 我正在运行一个Django站点(Django 1.6.1),后面是nginx的gunicorn。 So nginx does the SSL. 因此nginx执行SSL。 The environment variable HTTPS is set to on . 环境变量HTTPS设置为on

When I set up a test server without an http-to-https redirect, I noticed that some requests end up being redirected to an http address - similar to what you describe, but in my case it was just for one particular link. 当我设置一个没有http到https重定向的测试服务器时,我注意到有些请求最终被重定向到一个http地址 - 类似于你所描述的,但在我的情况下,它只是针对一个特定的链接。 After looking into the request and response headers, I found out: The initial request https://example.org/test got redirected by Django/gunicorn with 301 MOVED PERMANENTLY to http://exmaple.org/test/ . 在查看了请求和响应标头之后,我发现:初始请求https://example.org/test被Django / gunicorn重定向, 301 MOVED PERMANENTLYhttp://exmaple.org/test/ nginx then responded with 400 Bad Request - The plain HTTP request was sent to HTTPS port . 然后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

Quickly I came across a setting I had not paid much attention to before: APPEND_SLASH ( https://docs.djangoproject.com/en/1.6/ref/settings/#std:setting-APPEND_SLASH ) with the default value True . 我很快就遇到了一个我以前没注意过的设置: APPEND_SLASHhttps://docs.djangoproject.com/en/1.6/ref/settings/#std:setting-APPEND_SLASH ),默认值为True

After adding APPEND_SLASH = False to my settings.py file, a request to https://example.org/test resulted in a 404 NOT FOUND response, without a redirect to http. APPEND_SLASH = False添加到我的settings.py文件后,对https://example.org/test的请求导致404 NOT FOUND响应,没有重定向到http。 So it seems that APPEND_SLASH does not respect the HTTP environment variable setting - I guess configuring SECURE_PROXY_SSL_HEADER ( https://docs.djangoproject.com/en/1.6/ref/settings/#std:setting-SECURE_PROXY_SSL_HEADER ) would solve this, I have not tested it yet. 所以似乎APPEND_SLASH不尊重HTTP环境变量设置 - 我想配置SECURE_PROXY_SSL_HEADERhttps://docs.djangoproject.com/en/1.6/ref/settings/#std:setting-SECURE_PROXY_SSL_HEADER )会解决这个问题,我有尚未测试过。

By the way, the reason for that "faulty" link in my case was a hard-coded link in a template. 顺便说一下,在我的案例中,“错误”链接的原因是模板中的硬编码链接。 The easy way to avoid links like that is using the built-in {% url ... %} template tag ( https://docs.djangoproject.com/en/1.6/ref/templates/builtins/#url [sorry, I could not make this link clickable because I don't have "at least 10 reputation"...]). 避免这样的链接的简单方法是使用内置的{% url ... %}模板标记( https://docs.djangoproject.com/en/1.6/ref/templates/builtins/#url [对不起,我无法使这个链接可点击,因为我没有“至少10个声誉”...])。

Perhaps this helps you or anyone else who wonders why Django sometimes redirects from https to http. 也许这有助于你或其他任何想知道为什么Django有时会从https重定向到http的人。

I know this is an old question but I have just spent hours searching for a solution to an identical problem so I thought I would post what I eventually worked out here. 我知道这是一个古老的问题,但我花了几个小时寻找解决相同问题的解决方案,所以我想我会发布我最终在这里发布的内容。 I was using Satchmo as the original poster was, It has a middleware class satchmo_store.shop.SSLMiddleware.SSLRedirect which by default sends a redirect exactly as described in the original question from https to http with a 302 header response. 我正在使用Satchmo作为原始海报,它有一个中间件类satchmo_store.shop.SSLMiddleware.SSLRedirect,它默认发送完全如原始问题中描述的重定向,从https到带有302标题响应的http。 Commenting the line in MIDDLEWARE_CLASSES fixes the problem and may be OK if anyone wants to run completely over https but the documentation http://satchmo.readthedocs.org/en/latest/configuration.html#ssl explains how to use it properly which is what I am going to try to do. 在MIDDLEWARE_CLASSES中注释该行可以解决问题,如果有人想完全通过https运行,那么可能没问题,但文档http://satchmo.readthedocs.org/en/latest/configuration.html#ssl解释了如何正确使用它,这是我将尝试做什么。

Only thing that I can think of is your site setting in the database. 我能想到的只是数据库中的站点设置。 If you put an explicit port number in your Site object... Could you take a look in your admin? 如果您在Site对象中放置了明确的端口号...您可以查看管理员吗?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM