只有在IE9上提交django表单的HTTP 403

我正在使用Django版本1.4.2。 我已经实现了这个简单的表单示例(受djangobook启发):

# views.py from django.shortcuts import render from django.http import HttpResponseRedirect from django.core.mail import send_mail from mysite.contact.forms import ContactForm def contact(request): if request.method == 'POST': form = ContactForm(request.POST) if form.is_valid(): cd = form.cleaned_data send_mail( cd['subject'], cd['message'], cd.get('email', 'noreply@example.com'), ['siteowner@example.com'], ) return HttpResponseRedirect('/contact/thanks/') else: form = ContactForm() return render(request, 'contact_form.html', {'form': form}) # contact_form.html <html> <head> <title>Contact us</title> </head> <body> <h1>Contact us</h1> {% if form.errors %} <p style="color: red;"> Please correct the error{{ form.errors|pluralize }} below. </p> {% endif %} <form action="" method="post"> <table> {{ form.as_table }} {% csrf_token %} </table> <input type="submit" value="Submit"> </form> </body> </html> # forms.py from django import forms class ContactForm(forms.Form): subject = forms.CharField() email = forms.EmailField(required=False) message = forms.CharField() 

一切工作正常,我试过的所有浏览器(铬,maxthon,firefox),但在IE9,我得到了HTTP 403拒绝。

任何线索是什么原因造成的?

编辑:深入调查后,我发现问题来自:当问空表单,导航器收到csrf cookie,但由于未知的原因,发送表单时不发送这个cookie。 这个问题似乎只有当cookie来自pythonanywhere.com上的nginx服务器时,当我从我自己的apache服务器进行testing时,cookie才会发回。

以下是从服务器捕获的两个头文件:

 HTTP/1.1 200 OK Server: nginx/1.2.5 Date: Wed, 21 Nov 2012 13:56:31 GMT Content-Type: text/html; charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive Vary: Cookie Set-Cookie: csrftoken=1AJjzkbUgJdKAmkbiHicJ3or2Mfi6AbD; expires=Wed, 20-Nov-2013 13:56:31 GMT; Max-Age=31449600; Path=/ HTTP/1.1 200 OK Date: Wed, 21 Nov 2012 13:56:50 GMT Server: Apache/2.2.15 (CentOS) Vary: Cookie Set-Cookie: csrftoken=2iMZSH1s0vJnEt4tRRY7FciT1Q7orrVF; expires=Wed, 20-Nov-2013 13:56:50 GMT; Max-Age=31449600; Path=/ Keep-Alive: timeout=180, max=100 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/html; charset=utf-8 

唯一显着的区别似乎是apache的Kee-Alive头文件…

你认为它可以从那里?

{% csrf_token %}输出一个<input type="hidden" ...>标记,也许IE9忽略它,因为它是表的直接子{% csrf_token %} ,而不是在单元格内。

尝试将<input type="submit" value="Submit"> {% csrf_token %}移动到<input type="submit" value="Submit">旁边

在Django的#17157票据中指出,问题在于Internet Explorer默认阻止第三方Cookie。 因此,您可以为所有网站启用第三方Cookie,或者仅在浏览器设置中为您的网站启用第三方Cookie。 这里是如何做到这一点在IE 7(从这个链接 ):

  1. 点击“工具”菜单
  2. 点击“Internet选项”
  3. 选择“隐私”选项卡

选项1:为所有站点启用第三方Cookie

  1. 点击“高级”
  2. 选择“覆盖自动cookie处理”
  3. 选择“第三方Cookies”下的“接受”按钮并点击“确定”

要么

选项2:只为Feedjit.com启用第三方Cookie

  1. 点击“网站”
  2. 添加“ your-domain.com ”并点击“允许”
  3. 点击“确定”
  4. 选择“第三方Cookies”下的“接受”按钮并点击“确定”