簡體   English   中英

Django redirect()使用HTTPS在生產服務器上將URL截斷為域名

[英]Django redirect() truncating URLs to domain name on production server using HTTPS

我正在運行Django 1.8,Python 2.7。 我注意到站點上的重定向問題似乎只影響使用HTTPS協議的生產服務器,而不會影響運行純HTTP的登台服務器或開發服務器。

作為示例,我確定了兩個簡單的問題,這些問題目前在HTTPS上對我不起作用:

  1. 參觀https://www.eduduck.com/support/thanks沒有尾隨斜線重定向到https://www.eduduck.com/而不是附加一個斜線和重定向到的https://www.eduduck.com/support/謝謝/(與我期望的一樣)(默認設置)APPEND_SLASH = True。

  2. 使用HTTPS時,提交有效的支持表格“錯誤地”重定向到https://www.eduduck.com/網站的基本URL,但在HTTP上可以正常使用,重定向到/ support / thanks /

都是常規的東西,或者應該是。 對此很困惑; 非常感謝收到的所有指針。 注意:問題僅出現在HTTPS下

support / urls.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')),
]

support / forms.py

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

support / views.py

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兼容性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM