我在一个码头容器中部署了一个Daphne (ASGI)的Django 4应用程序。我在前面用凯迪做反向代理。它有效,但我不能填写任何表格,因为中央应急基金的保护开始生效。例如,没有管理员登录。
我目前可以通过两种方式访问管理界面:
备选方案1起作用。我可以像在本地运行开发服务器一样登录管理界面。一切都如期而至。
但是,选项2 (caddy反向代理)不起作用。我可以访问Django和加载页面,但是任何表单提交都将被阻止,因为CSRF保护已经启动。
CSRF verification failed. Request aborted.
Reason given for failure:
Origin checking failed - https://<mydomain.com> does not match any trusted origins.我的Caddyfile包含以下内容:
<mydomain.com> {
reverse_proxy localhost:8088
}本地主机:8088是由我的码头集装箱公开的港口。
为了消除潜在问题,我在配置文件中将以下设置为false:
SECURE_SSL_REDIRECT (导致重定向循环,可能与反向代理相关)SESSION_COOKIE_SECURE (我宁愿把它设置为True,但我现在还不知道)CSRF_COOKIE_SECURE (同样的评论)我可以在网上找到的唯一Django-Caddy示例已经过时,并引用了旧版本的Caddy和/或Django。Django和Daphne一起部署在ASGI上。
我已经看到了一些建议更改CSRF_TRUSTED_ORIGINS的帖子,但是我不得不添加一个已经在ALLOWED_HOSTS列表中的主机似乎是不对的。这也解释不了为什么它直接在码头容器上工作,除非localhost是CSRF的特例。
版本:
知道哪里出了问题吗?我该如何调试这些问题呢?
发布于 2022-06-13 17:33:15
终于知道发生了什么。
我首先想知道从caddy发送到django的确切HTTP请求:
sudo tcpdump -i lo -A -n port 8088这证实:
Origin和Referer头csrftoken cookie已正确发送一旦知道了这一点,我就可以从django中挖掘代码。具体来说,这个函数在CSRF中间件中。.
最后:
Origin标头为http://,因为请求不安全。在我的例子中,它是https://,因为我的浏览器正在通过https与Caddy对话。Origin头与CSRF中间件所期望的不匹配,所以请求被拒绝。其实这是个简单的解决办法。
由于我们知道浏览器中的凯蒂总是会忽略 X-Forwarded-Proto并设置它本身,所以我们可以在django中将标头添加到settings.py中:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')还有哇哦!
现在,我也可以将这些设置为真:
编辑这里是Caddyfile文件,根据请求:
service.mywebsite.com {
reverse_proxy localhost:8088
}https://stackoverflow.com/questions/72584282
复制相似问题