Python Django redirect()使用HTTPS在生产服务器上将URL截断为域名
我正在运行Django 1.8和Python 2.7。我注意到我的站点上有一个重定向问题,它似乎只会影响使用HTTPS协议的生产服务器,而不会影响运行纯HTTP的登台或开发服务器 作为示例,我已经确定了两个简单的东西,它们目前在HTTPS上不适用于我: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
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个默认_服务器;(在我的服务器{}块中)