我在 HAproxy 后面的 Apache 上运行自托管的 Nextcloud 安装。
我遇到了字体错误,类似于在此论坛帖子中描述。作为补救措施,建议进行Content-Security-Policy
如下修改:
<IfModule mod_headers.c>
Header set Content-Security-Policy: "font-src https: data:;"
# `mod_headers` cannot match based on the content-type, however,
# the `Content-Security-Policy` response header should be send
# only for HTML documents and not for the other resources.
<FilesMatch "\.(appcache|atom|bbaw|bmp|crx|css|cur|eot|f4[abpv]|flv|geojson|gif|htc|ico|jpe?g|js|json(ld)?|m4[av]|manifest|map|mp4|oex|og[agv]|opus|otf|pdf|png|rdf|rss|safariextz|svgz?|swf|topojson|tt[cf]|txt|vcard|vcf|vtt|webapp|web[mp]|webmanifest|woff2?|xloc|xml|xpi)$">
Header unset Content-Security-Policy
</FilesMatch>
</IfModule>
但是,这有一个我无法解释的影响。如果我通过 Firefox/Chrome 访问 Nextcloud,则有两个Content-Security-Policy
标头:
据我所知,这会导致“Content-Security-Policy: font-src https: data:;”标头被忽略,因为它的限制较少。我遇到的问题仍然存在。
但是,如果我通过 IE 访问 Nextcloud,我会看到一个标题:
Content-Security-Policy: font-src https: data:;, default-src 'self'; script-src * 'unsafe-inline'
'unsafe-eval'; style-src * 'unsafe-inline'; img-src * 'unsafe-inline' data:; font-src *;
object-src 'self';media-src 'self'; frame-src 'self';
在这种情况下,问题已解决并且字体已加载。
什么原因导致 Chrome/Firefox 中出现第二个标头?我该如何解决此问题?
答案1
IE 似乎将 的两个值合并在一起Content-Security-Policy
,而其他浏览器则没有,这会导致不同的行为。但问题是标头被设置了两次。有几个选项:
Content-Security-Policy
在您的配置中找到正在设置的其他位置,并将其删除。您的标头值是根据条件设置的
onsuccess
(默认值),因此其他值也必须根据条件设置always
。请参阅标头。Apache 会合并这两个列表并同时发送它们。因此,您可以清除条件中的值always
:Header always unset Content-Security-Policy Header onsuccess set Content-Security-Policy "font-src https: data:;"
或者用你的值替换
always
:Header always set Content-Security-Policy "font-src https: data:;"
答案2
经过进一步挖掘,我相信我已经找到了答案。
事实证明,HAproxy 正在向通过它的请求添加与安全相关的标头。这导致了重复。浏览器的不同行为是一个症状,因为 CSP 标头特定于 Chrome。
通过在 HAproxy 中引入可被不同浏览器解析的不同 CSP 标头,解决了该问题。这也解决了字体无法加载的原始问题。
也感谢安德鲁 (Andrew) 对此问题的帮助。