我正在开发一个 React 应用程序,我正在尝试集成 keywords.js 以实现视觉效果。虽然一切在我的本地开发环境中都运行良好,但当我部署到生产环境时,我遇到了内容安全策略 (CSP) 问题。
在我的生产环境中,我在 HTML 中使用以下 CSP 元标记:
<meta http-equiv="Content-Security-Policy" content="default-src 'self' https://cdn.jsdelivr.net 'unsafe-inline'; script-src 'self' https://cdn.jsdelivr.net 'unsafe-inline'; script-src-elem 'self' https://cdn.jsdelivr.net 'unsafe-inline'; style-src 'self' 'unsafe-inline'" >
检查生产环境时,控制台出现如下错误:
Refused to load the script 'https://cdn.jsdelivr.net/particles.js/2.0.0/particles.min.js' because it violates the following Content Security Policy directive: "default-src 'self'". Note that 'script-src-elem' was not explicitly set, so 'default-src' is used as a fallback.
Refused to execute inline script because it violates the following Content Security Policy directive: "default-src 'self'". Either the 'unsafe-inline' keyword, a hash ('sha256-sE1QKI+3nnpP92ZRF6Ro5DLUkDvouqP/XSbFGAbo0ZU='), or a nonce ('nonce-...') is required to enable inline execution. Note also that 'script-src' was not explicitly set, so 'default-src' is used as a fallback.
在本地,我将内容安全策略 (CSP) 设置为仅允许 self 和 keywords.js 的 CDN。它提示我添加“不安全内联”以允许内联脚本,这解决了问题。
但是,当我部署到生产环境时,相同的设置不起作用。来自 CDN 的外部脚本仍然被阻止,我无法加载 keywords.js。我不确定为什么它在本地有效但在生产中不起作用。任何帮助将不胜感激!
谢谢大家的建议!我今天早些时候设法解决了该问题,而无需使用 http-equiv 内容安全策略元标记。
解决方案是下载实际的 keywords-min.js 文件并将其存储在与我的 index.html 相同的目录中,这样我就不必依赖来自 cdn.jsdelivr.net 的外部链接。
对于第二个错误,我将内联脚本移动到外部的 keywords-config.js 文件中,并从那里调用它。一切都在生产服务器上完美运行!
<!DOCTYPE html>
<html lang="en">
<head>
<script src="particles.min.js"></script>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="particles-js"></div>
<div id="root"></div>
<script src="particles-config.js"></script>
</body>
</html>