django - 通过heroku在亚马逊云前端提供django应用程序时,发布请求出现403 Forbidden错误
问题描述
我在 heroku 中部署了一个 django 应用程序,该应用程序以前可以运行,但是在添加 Edge 插件后,该插件可以从 Amazon Cloudfront 为您的静态文件提供缓存服务,我的所有发布请求都出现 403 错误。
我确实正确传递了 csrf 令牌,因为我的帖子请求在未从云端提供服务时仍然有效,但在云端我收到 CSRF 验证失败的错误
它还提到缺少引用标头,但是我可以在开发人员工具的网络选项卡的请求标头中看到引用标头。
知道我在这里缺少什么吗?
解决方案
CloudFront 在将请求发送到服务器之前删除引用标头。以下链接指定如何处理每个标头:https ://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html#request-custom-headers-behavior
使用 AWS CLI,我必须配置我的 CloudFront 分配来转发请求标头和 csrftoken,因为 cookie 也不会转发。可以在此处找到说明: https ://devcenter.heroku.com/articles/edge#cloudfront-configuration
我的配置的 ForwardedValues 部分如下所示:
"ForwardedValues": {
"QueryString": false,
"Cookies": {
"Forward": "whitelist",
"WhitelistedNames": {
"Quantity": 2,
"Items": [
"_app_session",
"csrftoken",
]
}
},
"Headers": {
"Quantity": 2,
"Items": [
"Origin",
"Referer"
]
},
"QueryStringCacheKeys": {
"Quantity": 0
}
}
我还必须更新我的 django 设置文件以包含
CSRF_TRUSTED_ORIGINS = [<CLOUDFRONT_URL>]
注意:虽然上述说明解决了我在原始问题中的问题,但我确实必须转发额外的 cookie,例如“sessionid”和“messages”才能让 django 应用程序的其他功能正常工作。
推荐阅读
- php - Laravel 在浮点数上调用成员函数 addEagerConstraints()
- google-apps-script - 超过一天的内存不足错误。代码不运行
- python - Pandas DataFrame - 如何在迭代 DataFrame 时对先前行的选择执行统计信息
- reactjs - React.js:从状态数组中获取值作为字符串
- javascript - Redux + Typescript + 功能组件:导入的组件需要来自 Redux 的 props
- java - 为什么我们不能将所有字符串存储在字符串池中?
- python - Python 3,如何在 tkiner Combobox 中使用全局变量
- cmake - 如何将 --whole-archive 标志添加到 cmake 中的导入目标?
- c# - 比较字符串列表的日期与数据表的日期并更新数据表 C#
- javascript - 推送到heroku时执行/usr/bin ls-remote -h -t ssh://git@github.com/xxxx/xxxx.git 时出错