Chrome "Unsafe attempt to load URL" 在相同的域、协议和端口上

Chrome "Unsafe attempt to load URL" on same Domains, protocols and ports

在 Chrome 中,当我尝试访问下面错误中显示的 xml link 时,我得到了这个错误。

Unsafe attempt to load URL http://build:8080/view/application/job/Project/Report/SourceMonitor.xslt from frame with URL http://build:8080/view/application/job/Project/Report/SourceMonitor-details.xml. Domains, protocols and ports must match.

据我所见,域、协议和端口是相同的。
这些文件都托管在 Jenkins CI 网络服务器上,所以不是因为它是本地文件。
当我在 Internet Explorer 中打开 xml 文件时它起作用了。
xml 文件 links 到带有 xml 标签的 xslt,如下所示。

<?xml-stylesheet type="text/xsl" href="SourceMonitor.xslt"?>

我在这里错过了什么?

我在没有内部 Jenkins 基础设施的情况下偶然发现了同样的问题,但是根据它的文档,Docker 可以很容易地用 Jenkins Docker 图像重现它,并且有一个管道作业生成 XSLT文件和引用该 XSLT 文件的 XML 文件。通过 Node Allocate 节点中的工作区文件夹打开 XML : Start 将失败,并且 Chrome 将输出问题所述的错误。

这不仅限于 Chrome,因为 Firefox 也会报告错误,类似于:

Error loading stylesheet: A network error occurred loading an XSLT stylesheet http://build:8080/view/application/job/Project/Report/SourceMonitor.xslt

解决这个问题需要配置 Jenkins 使用的内容安全策略 (CSP)。内容安全策略的工作原理解释如下:.

Jenkins 的默认 CSP 配置非常严格,不允许从引用它的文档中加载 XSL 文件。默认 CSP 配置以及如何更改它记录在 Jenkins wiki 页面上。

根据 CSP 文档(CR-CSP-20121115 第 4.2 章 script-src)XSL 样式 sheets 被视为脚本,我不得不添加 script-src 'self';sandbox allow-same-origin; 到默认配置,使简单的 XSL 样式 sheet 工作。我通过 运行:

的 Jenkins Script Console 做到了这一点
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP","sandbox allow-same-origin; default-src 'none'; img-src 'self'; style-src 'self'; script-src 'self';")

使用 System.setProperty 临时更改 CSP 直到下次重新启动,它都记录在 Jenkins wiki 页面上。

查找 Chrome 或其他浏览器报告的任何进一步错误,因为 XSLT 文件中的内容可能还要求您放宽其他 CSP 规则,例如允许解释样式标签。