Python Django redirect()使用HTTPS在生产服务器上将URL截断为域名

Python Django redirect()使用HTTPS在生产服务器上将URL截断为域名,python,django,redirect,https,Python,Django,Redirect,Https,我正在运行Django 1.8和Python 2.7。我注意到我的站点上有一个重定向问题,它似乎只会影响使用HTTPS协议的生产服务器,而不会影响运行纯HTTP的登台或开发服务器 作为示例,我已经确定了两个简单的东西,它们目前在HTTPS上不适用于我: 不带尾随斜杠的访问将重定向到,而不是像我使用(默认设置)APPEND_slash=True预期的那样附加斜杠并重定向到 提交有效的支持表单“错误”会在使用HTTPS时重定向到网站基url,但与HTTP一起正常工作,重定向到/support/tha

我正在运行Django 1.8和Python 2.7。我注意到我的站点上有一个重定向问题,它似乎只会影响使用HTTPS协议的生产服务器,而不会影响运行纯HTTP的登台或开发服务器

作为示例,我已经确定了两个简单的东西,它们目前在HTTPS上不适用于我:

  • 不带尾随斜杠的访问将重定向到,而不是像我使用(默认设置)APPEND_slash=True预期的那样附加斜杠并重定向到

  • 提交有效的支持表单“错误”会在使用HTTPS时重定向到网站基url,但与HTTP一起正常工作,重定向到/support/thanking/

  • 这都是例行公事,或者应该是。对此十分困惑,;非常感谢您的指点NB:问题仅出现在HTTPS下

    支持/url.py

    from django.conf.urls import url
    from django.views.generic import TemplateView
    
    from . import views
    
    urlpatterns = [
        url(r'^$', views.support, name='support'),
        url(
            r'^thanks/$',
            TemplateView.as_view(template_name ='support/thanks.html')),
    ]
    
    from django import forms
    
    class SupportForm(forms.Form):
        """General request for support or contact"""
        subject = forms.CharField(max_length = 100)
        email = forms.EmailField(label='Your email')
        message = forms.CharField(widget = forms.Textarea)
    
        def clean_message(self):
            """Sensible messages cannot be too short"""
    
            message = self.cleaned_data['message']
            wc = len(message.split())
            if wc < 4:
                raise forms.ValidationError(
                    "Please muster four or more words of wisdom or woe!"
                )
            return message
    
    from django.core.mail import send_mail
    
    from django.http import HttpResponseRedirect
    from django.shortcuts import render
    from django.template import RequestContext
    
    from .forms import SupportForm
    
    import logging
    logger = logging.getLogger(__name__)
    
    def support(request):
        """Provide a support/contact email form"""
    
        logger.info('Support view')
        if request.method=="POST":
            form = SupportForm(request.POST)
            if form.is_valid():
                cdata = form.cleaned_data
                send_mail(cdata['subject'],
                          cdata['message'],
                          cdata.get('email', 'example@example.com'),
                            ['example@example.com'],
                )
                return HttpResponseRedirect('/support/thanks/')
        else:
            form = SupportForm()
    
        return render(
            request, 
            'support/support.html',
            {'support_form': form}, 
        )
    
    支持/forms.py

    from django.conf.urls import url
    from django.views.generic import TemplateView
    
    from . import views
    
    urlpatterns = [
        url(r'^$', views.support, name='support'),
        url(
            r'^thanks/$',
            TemplateView.as_view(template_name ='support/thanks.html')),
    ]
    
    from django import forms
    
    class SupportForm(forms.Form):
        """General request for support or contact"""
        subject = forms.CharField(max_length = 100)
        email = forms.EmailField(label='Your email')
        message = forms.CharField(widget = forms.Textarea)
    
        def clean_message(self):
            """Sensible messages cannot be too short"""
    
            message = self.cleaned_data['message']
            wc = len(message.split())
            if wc < 4:
                raise forms.ValidationError(
                    "Please muster four or more words of wisdom or woe!"
                )
            return message
    
    from django.core.mail import send_mail
    
    from django.http import HttpResponseRedirect
    from django.shortcuts import render
    from django.template import RequestContext
    
    from .forms import SupportForm
    
    import logging
    logger = logging.getLogger(__name__)
    
    def support(request):
        """Provide a support/contact email form"""
    
        logger.info('Support view')
        if request.method=="POST":
            form = SupportForm(request.POST)
            if form.is_valid():
                cdata = form.cleaned_data
                send_mail(cdata['subject'],
                          cdata['message'],
                          cdata.get('email', 'example@example.com'),
                            ['example@example.com'],
                )
                return HttpResponseRedirect('/support/thanks/')
        else:
            form = SupportForm()
    
        return render(
            request, 
            'support/support.html',
            {'support_form': form}, 
        )
    

    所以最后,是的,这是我的nginx配置。我启用了一个旧站点/默认配置文件,并将其删除。这取得了一些进展,但我还必须编辑生产站点的配置文件。最终(工作)服务器块的差异如下所示:

    server {
        - listen [::]:80 default_server; 
        + listen 80 default_server;
        server_name www.example.com;
        return 301 https://$host$request_uri
    }
    

    正如我在前面的评论中提到的,尽管阅读了文档,但我仍然不知道[:]:80有什么问题,我认为这是为了IPv6兼容性。

    您的Apache配置是什么样的?我认为SSL的静态配置与普通(端口80)不同。谢谢@polarise,我没有想到Web服务器本身。我没有运行Apache,但我正在查看我的nginx配置。很可能就是这样。是的,您的web服务器不必是Apache!所以最后,是的,这是我的nginx配置。我启用了一个旧站点/默认配置文件,并将其删除。这取得了一些进展,可以在nginx日志文件中看到。最后的修改是-listen[:]:80 default_server;+监听80个默认_服务器;(在我的服务器{}块中)