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 |
- 我猜你在开发中使用了http。因此,应用程序必须配置为在您的local.py中使用http(或类似)。
您的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文件中,该文件导入本地主机和生产服务器共同使用的其他设置。本地主机将使用不包含这些行的另一组设置。
- 对。我明白你的意思。在我在问题中指定的那些行之前,存在这样的条件if not ENVIRONMENT == 'localhost'。这意味着我在问题中指定的那些行只在生产中执行。那么,为了防止这个错误,我需要在设置中添加什么呢?
- 只是检查一下,如果您完全删除了这三行,那么站点在localhost上工作吗?那会发生什么错误?问题是您的HTTP_REFERER元标记没有在localhost上使用https。见django/django/middleware/csrf.py167-168行
- 当我评论这三行时,我仍然会得到同样的错误。
- 您必须显示其余的settings.py文件(确保注释掉或删除任何键)。基本的解决方案是删除本地settings.py中引用https的任何内容,所以我只想查找强制https在本地使用的设置。
- 我能解决这个问题。我正在使用的另一个图书馆django-cors-headers导致了这个问题。我不得不通过添加CORS_REPLACE_HTTPS_REFERER = True来避免这种情况。问题解决了。:)无论如何,谢谢。