2016-01-07 41 views
5

我将Django从1.8升级到1.9。后来,我得到我的本地主机此错误admin界面登录后:CSRF验证失败 - Referer在主机安全时不安全

Referer checking failed - Referer is insecure while host is secure

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

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') 
SESSION_COOKIE_SECURE = True 
CSRF_COOKIE_SECURE = True 
+0

我想你在开发中使用'http'。所以应用程序必须配置为在你的local.py(或类似的)中使用'http'。 – sobolevn

回答

2

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也是如此,否则您将得到您引用的错误。

一个解决方案是adjust your settings.py file depending on whether you're in your local or production environment。这样,您可以将这三行添加到settings_production.py文件中,该文件导入本地主机和生产服务器共同的其他设置。您的本地主机将使用不包含这些行的一组不同的设置。

+0

是的。我明白你的观点。在我的问题中指定的那些行之前,有这种情况'如果不是环境=='localhost''。这意味着我在我的问题中指定的行仅在生产中执行。那么,我必须添加到我的设置以防止此错误? – Farcorn

+0

只是为了检查,如果你完全删除这三行,该网站是否在'localhost'上工作?那么发生的错误是什么?问题在于''HTTP_REFERER'元标记在'localhost'上没有使用'https'。 查看['django/django/middleware/csrf.py']的行167-168(https://github.com/django/django/blob/master/django/middleware/csrf.py) – YPCrumble

+0

我还是得到同样的错误,当我评论这三条线。 – Farcorn