Content-Security-Policy、Next JS 和 AMP 的问题
Problem with Content-Security-Policy, Next JS and AMP
我正在使用 Next JS 开发一个 AMP 应用程序,它在本地主机上运行良好,但在生产中我遇到了来自 AMP 的错误,不允许加载其工作程序。
初始错误是:
Refused to create a worker from 'blob:' because it violates the following Content Security Policy directive: "default-src * data: 'unsafe-eval' 'unsafe-inline'". Note that 'worker-src' was not explicitly set, so 'default-src' is used as a fallback.
好的我明白了这个错误,我可以看到next JS默认发送的header是default-src * data: 'unsafe-eval' 'unsafe-inline'
并且不允许加载blob:
,所以浏览器拒绝加载 AMP 的脚本。
所以我在 next.config.js
中添加了一个 header(我正在使用具有此新功能的下一个 9.5)以允许 blob 用于工作人员:
async function headers() {
return [
{
source: "/",
headers: [
{
key: "Content-Security-Policy",
value: "default-src * data: 'unsafe-eval' 'unsafe-inline'; worker-src blob:;",
},
],
}
];
}
通过这个配置,我可以看到 header 被正确地添加到响应中,但是现在有两个 headers,nextJS 仍然默认发送他的 header :
所以现在我的响应中有两个header,第一个是我的并且定义了worker-src,第二个是下一个JS默认的并且没有定义[=41] =].
我希望浏览器能够理解它,但它不起作用,我仍然有同样的错误,浏览器没有接受我的 worker-src 政策。
注意:我无法使用标签 <meta http-esquiv="content-security-policy" />
,因为它不是有效的 AMP。
注2:worker只被部分AMP组件加载,我认为主要是amp-bind和amp-script。有很多组件我没有这个问题。
有人对此有解决方案吗?
非常感谢您的阅读。
对于多个 CSP,浏览器将只允许所有 CSP 中允许的内容。默认的下一个 JS CSP 将阻止 blob,即使您的自定义 CSP 允许它。您可能需要删除其中一个 CSP 并修改另一个以满足您的需要。
另请参阅 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy
中的“多个内容安全策略”部分
我正在使用 Next JS 开发一个 AMP 应用程序,它在本地主机上运行良好,但在生产中我遇到了来自 AMP 的错误,不允许加载其工作程序。
初始错误是:
Refused to create a worker from 'blob:' because it violates the following Content Security Policy directive: "default-src * data: 'unsafe-eval' 'unsafe-inline'". Note that 'worker-src' was not explicitly set, so 'default-src' is used as a fallback.
好的我明白了这个错误,我可以看到next JS默认发送的header是default-src * data: 'unsafe-eval' 'unsafe-inline'
并且不允许加载blob:
,所以浏览器拒绝加载 AMP 的脚本。
所以我在 next.config.js
中添加了一个 header(我正在使用具有此新功能的下一个 9.5)以允许 blob 用于工作人员:
async function headers() {
return [
{
source: "/",
headers: [
{
key: "Content-Security-Policy",
value: "default-src * data: 'unsafe-eval' 'unsafe-inline'; worker-src blob:;",
},
],
}
];
}
通过这个配置,我可以看到 header 被正确地添加到响应中,但是现在有两个 headers,nextJS 仍然默认发送他的 header :
所以现在我的响应中有两个header,第一个是我的并且定义了worker-src,第二个是下一个JS默认的并且没有定义[=41] =].
我希望浏览器能够理解它,但它不起作用,我仍然有同样的错误,浏览器没有接受我的 worker-src 政策。
注意:我无法使用标签 <meta http-esquiv="content-security-policy" />
,因为它不是有效的 AMP。
注2:worker只被部分AMP组件加载,我认为主要是amp-bind和amp-script。有很多组件我没有这个问题。
有人对此有解决方案吗?
非常感谢您的阅读。
对于多个 CSP,浏览器将只允许所有 CSP 中允许的内容。默认的下一个 JS CSP 将阻止 blob,即使您的自定义 CSP 允许它。您可能需要删除其中一个 CSP 并修改另一个以满足您的需要。
另请参阅 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy
中的“多个内容安全策略”部分