我在 Docker 环境中的 Nginx 后面运行 Django 应用程序。我的问题与此线程有点相同:Django 返回“CSRF 验证失败。请求中止。”在本地 Nginx 代理后面.
得知我必须在设置中添加
CSRF_TRUSTED_ORIGINS
,因为我使用的是Django 4.X版,所以我添加了本地主机
CSRF_TRUSTED_ORIGINS = [
'http://localhost',
'http://localhost:3000',
'https://example.com',
]
当容器在本地部署时,我可以登录到我的管理员。但是,当我将其部署到生产环境时,仍然出现错误:
CSRF 验证失败。请求中止。
我将其部署在谷歌计算引擎中。该应用程序还没有域名。因此,我使用机器的外部地址访问该应用程序:
http://XX.XX.XX.XX/admin
。我应该把这个地址添加到我的CSRF_TRUSTED_ORIGINS
吗?我的理解是,这与添加本地主机相同http://localhost
,因为我正在访问主机的地址。
CSRF_TRUSTED_ORIGINS = [
'http://localhost',
'http://localhost:3000',
'https://example.com',
'http://XX.XX.XX.XX'
]
如果我将它部署到具有不同地址的另一台机器上怎么办?我应该再次添加它吗?有没有其他方法允许 CSRF 而无需专门添加地址,因为如果我要在主机中更改/迁移会很乏味?
这是我的nginx配置,如果有帮助的话。
upstream api {
server container_name:8000;
}
server {
listen 80;
location / {
proxy_pass http://api;
}
location /static/ {
alias /static/;
}
}
关于添加另一台机器的 IP 地址的问题,您还需要将其添加到您的 CSRF_TRUSTED_ORIGINS 设置中。如果不明确将源添加到受信任列表,就没有其他方法允许 CSRF。
如果您不想将特定 IP 地址或域名添加到受信任列表,您可以通过从 MIDDLEWARE 设置中删除 CsrfViewMiddleware 中间件来完全禁用 CSRF 保护。但是,不建议这样做,因为它可能会使您的应用容易受到 CSRF 攻击。
在生产环境中,Django 的设置有点不同。您可以尝试以下两件事:
setting.py
中添加CSRF_TRUSTED_ORIGINS = ['https://your-domain.com']
setting.py
中添加STATIC_URL = 'static/'
或您在nginx配置中更改的任何路径。由于您在代理后面使用它,因此可能无法正确提供 js 和 CSS。在那种情况下,#2 很有用。