我的Django管理网站的静态文件是在S3桶(DigitalOcean空间实际上),并在控制台中我得到一个ERR_BLOCKED_BY_RESPONSE。NotSameOriginAfterDefaultedToSameOriginByCoep 200
在网络面板中,所有的静态文件都被认为是第三方的,并且因为这个原因(不是相同的来源)而被阻止
对这些文件中的任何一个的响应都包含一个not setcross-origin-resource-policy错误,该错误表示:
要使用来自不同源的资源,服务器需要在响应头中指定跨源资源策略。
What I tried:
- 在错误消息之后,我试图在资源上设置响应头,如
Cross-Origin-Resource-Policy: cross-origin
。但是在DigitalOcean空间中,我不能设置除Content-Type
,Cache-Control
,Content-Encoding
,Content-Disposition
和自定义x-amz-meta-
头之外的头。 - 我尝试扩展Djangoadmin/base.html模板,复制一些
link
标签并手动设置crossorigin
属性给它们。通过这种方式,资源被查询两次,一个查询像以前一样被阻塞,而另一个正在工作。头文件中唯一的区别是设置了Origin
。是否有一种方法告诉Django在Django管理模板的所有link
和script
和img
标签上添加crossorigin
属性? - 我试图删除入口负载均衡器上的
Cross-Origin-Opener-Policy
和Cross-Origin-Embeder-Policy
头,我猜这会导致阻塞,通过将它们设置为unsafe-none
。尽管我认为它应该与政策一致,但这一变化对我不理解的问题没有影响。
我没有尝试:
- 我发现这个教程解释了如何在S3响应上设置自定义标头。这个想法是在前面有一个Lambda函数,将
x-amz-
头修改为标准头。我不确定我可以很容易地用DigitalOcean Functions复制这个。
我的解决方案:
- 丑陋的hack是复制所有在需要的地方手动添加一个
crossorigin
属性。
我不知道这是从哪里来的,几个星期前一切都很好。谢谢你的帮助。
使用HTTP 2+,可以更有效地提供来自同一域的资产,因为它们可以在单个连接上提供服务。大多数网站都应该这样做。白噪声是一种流行的解决方案,只需最少的配置:https://whitenoise.evans.io/en/stable/
这就解决了问题。
Thanks to Adam Johnson from djangoproject.