在文本浏览器中使用 Django 的 https 站点抛出 CSRF 验证失败

https site with Django in text browser throws CSRF verification failed

我有一个 Django 站点,它在使用 HTTPS 协议的服务器上运行良好,我可以在所有类型的浏览器上正常使用它。

问题是每次我尝试使用文本浏览器时,我都会得到一个

禁止访问 (403)

CSRF verification failed. Request aborted.

You are seeing this message because this HTTPS site requires a 'Referer header' to be sent by your Web browser, but none was sent.
This header is required for security reasons, to ensure that your browser is not being hijacked by third parties.

If you have configured your browser to disable 'Referer' headers, please re-enable them, at least for this site, or for HTTPS
connections, or for 'same-origin' requests.

Help

Reason given for failure:

    Referer checking failed - no Referer.

我在 emacs 上试过 links、lynx、甚至 w3m 和 eww,都无济于事。

当我使用 HTTP 站点时(比如当我使用 manage.py runserver 时)我可以在文本浏览器上毫无问题地使用该站点,但是我的生产服务器需要 HTTPS 协议,那时我收到此错误。

[ 编辑:仅出于测试目的,我在生产服务器上为我的 django 站点部署了一个 HTTP 服务器。它在文本浏览器上运行良好...]

[ 编辑:给定服务器抛出的消息,为什么没有给出 Referer headers? ]

您是否在设置中设置了 SECURE_PROXY_SSL_HEADER、SESSION_COOKIE_SECURE 和 CSRF_COOKIE_SECURE?

https://docs.djangoproject.com/en/1.7/topics/security/#ssl-https

Lynx 可能配置为不发送 Referer header。检查 /etc/lynx.cfg 是否有 "REFERER".

有像 NO_REFERER_HEADER 这样的条目。确保将其设置为 false。如果不是这样,请在该配置中检查是否有任何其他禁用的引用 headers.

此外,CSRF 和 Referer header 辩论:https://code.djangoproject.com/ticket/16870