【问题标题】:Django is redirecting from HTTPS to HTTPDjango 正在从 HTTPS 重定向到 HTTP
【发布时间】:2012-02-01 14:22:55
【问题描述】:

我有一个 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 的重定向。

我已经为此苦苦挣扎了一段时间,任何帮助都会很棒!

谢谢

【问题讨论】:

  • cms/urls.py 中是否有任何重定向的内容?
  • 我们正在使用 DjangoCMS- 里面什么都没有......

标签: django apache ssl https sysadmin


【解决方案1】:

您可能已经修复了它,它可能是一个完全不同的问题,但我只是遇到了一些听起来有点相似的东西,并且由于我没有找到解决您问题的答案,我认为发布回复可能是值得的(尽管我有一个 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 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 为我解决了这个问题。
  • 我设置了SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https'),但在某些情况下仍会重定向到 HTTP。我正在使用 Django 1.6.5 并在 AWS 上部署在将 HTTPS“代理”到非 HTTPS 的负载均衡器后面。不幸的是,我需要APPEND_SLASH
  • 如果您设置了 HTTP_X_FORWARDED_PROTO 并正确配置了您的 Web 服务器,它通常应该可以工作。也许负载平衡器弄乱了标头?
【解决方案2】:

我知道这是一个老问题,但我刚刚花了几个小时寻找相同问题的解决方案,所以我想我会在这里发布我最终解决的问题。 我使用 Satchmo 作为原始海报,它有一个中间件类 satchmo_store.shop.SSLMiddleware.SSLRedirect ,默认情况下,它发送一个重定向,完全按照原始问题中的描述从 https 到 http 并带有 302 标头响应。评论 MIDDLEWARE_CLASSES 中的行可以解决问题,如果有人想完全通过 https 运行可能没问题,但文档 http://satchmo.readthedocs.org/en/latest/configuration.html#ssl 解释了如何正确使用它,这是我将尝试做的。

【讨论】:

    【解决方案3】:

    我能想到的只有您在数据库中的站点设置。如果你在你的Site 对象中加入一个明确的端口号......你能看看你的管理员吗?

    【讨论】:

      猜你喜欢
      • 2013-12-20
      • 2022-01-06
      • 2018-08-13
      • 2019-09-10
      • 2017-10-06
      • 2017-11-04
      • 2016-01-17
      • 2011-09-28
      • 2017-07-18
      相关资源
      最近更新 更多