首页 > 解决方案 > 通过heroku在亚马逊云前端提供django应用程序时,发布请求出现403 Forbidden错误

问题描述

我在 heroku 中部署了一个 django 应用程序,该应用程序以前可以运行,但是在添加 Edge 插件后,该插件可以从 Amazon Cloudfront 为您的静态文件提供缓存服务,我的所有发布请求都出现 403 错误。

我确实正确传递了 csrf 令牌,因为我的帖子请求在未从云端提供服务时仍然有效,但在云端我收到 CSRF 验证失败的错误CSRF 验证失败

它还提到缺少引用标头,但是我可以在开发人员工具的网络选项卡的请求标头中看到引用标头。

知道我在这里缺少什么吗?

标签: djangoherokuamazon-cloudfront

解决方案


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 应用程序的其他功能正常工作。


推荐阅读