关于django:CSRF验证失败 – 当主机安全时,Referer不安全

CSRF verification Failed - Referer is insecure while host is secure

我把Django从1.8升级到1.9。然后,在Django管理员登录后,我在本地主机上收到此错误:

Referer checking failed - Referer is insecure while host is secure

生产中一切正常。下面是my settings.py文件的一个片段:

1
2
3
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True


您的settings.py文件中的那些行在生产时很好,因为您使用的是附加到您的域的SSL证书。然而,在本地,您可能正在使用http://localhost:8000或类似的东西。如果你试图通过https://localhost:{{YOUR_PORT_NUMBER}}连接,你很可能会得到一个像ERR_SSL_PROTOCOL_ERROR那样的错误。

问题出现在django/django/middleware/csrf.py的第167-168行。当你在生产中使用https时,request.is_secure()返回True,这要求HTTP_REFERER也是正确的,否则你会得到你引用的错误。

一种解决方案是根据您所在的本地环境还是生产环境来调整您的settings.py文件。这样,您可以将这三行添加到settings_production.py文件中,该文件导入本地主机和生产服务器共同使用的其他设置。本地主机将使用不包含这些行的另一组设置。