相对路径导致的CORS错误在Discourse网站上

lib/highlight_js.rb 中的以下代码在某些域上有效,但在其他域上无效:

def self.path
    "/highlight-js/#{Discourse.current_hostname}/#{version SiteSetting.highlighted_languages}.js"
end

我有两个 Discourse 站点。此代码在域 www.abc.com 上有效,但在 efg.com 上无效。在浏览器控制台中,我看到以下错误:

formatter.js:383 Uncaught (in promise) TypeError: Failed to resolve module specifier '/highlight-js/efg.com/9797975efac87d28baa695ae13ca72ccaf5120f5.js'. The base URL is about:blank because import() is called from a CORS-cross-origin script.

在对 highlight_js.rb 中的 self.path 进行如下修改后:

def self.path
    "https://#{Discourse.current_hostname}/highlight-js/#{Discourse.current_hostname}/#{version SiteSetting.highlighted_languages}.js"
end

该问题已解决。

看起来使用相对路径,如
import('/highlight-js/efg.com/9797975efac87d28baa695ae13ca72ccaf5120f5.js')
会导致 CORS 问题,而使用绝对 URL,
import('https://efg.com/highlight-js/efg.com/9797975efac87d28baa695ae13ca72ccaf5120f5.js')
则可以正常工作。

1 个赞

奇怪的是,它在 abc.com 下可以工作,但在 efg.com 下卻不行,因為這兩個不同的路由是完全不同的 :thinking:

我的意思是它适用于 www.abc.com 但不适用于 efg.com,不确定为什么,但它发生在我的案例中

1 个赞

您是否在这两个网站上使用了 CDN?我注意到我的网站上的代码高亮已不再有效,我认为这是因为:

就我而言,我的 CDN 没有为 highlightjs 文件返回 Access-Control-Allow-Origin 标头。我注意到 Meta 的 CDN 确实包含该标头,所以我想知道有什么不同。

$ curl --silent -I https://d3bpeqsaub0i6y.cloudfront.net/highlight-js/meta.discourse.org/9797975efac87d28baa695ae13ca72ccaf5120f5.js | grep -i access-control
access-control-allow-origin: *
access-control-allow-methods: GET, HEAD, OPTIONS

但是,这些标头没有由源服务器提供:

$ curl --silent -I https://meta.discourse.org/highlight-js/meta.discourse.org/9797975efac87d28baa695ae13ca72ccaf5120f5.js | grep -i access-control

据我所知,Discourse 应该为 highlightjs 文件添加访问控制标头:

但是,只有当请求是“CDN 请求”时,这些标头才会被应用:

这仅在 Discourse 配置了单独的“CDN 请求”主机名时才有效。

1 个赞

有一个设置 cdn_origin_hostname,或许可以设置为普通的 discourse 主机名:

我认为这会使 is_cdn_request 检查通过,但我不知道是否会有任何负面影响。

是的,我在 efg.com 上使用 CDN,但当我访问 js 文件时,它确实返回了我正确的 Access-Control-Allow-Origin,这让我很困惑。

作为后续,我将 cdn_origin_hostname 设置为我的 Discourse 实例的常规域名,刷新了 CDN 缓存,现在 highlightjs 又可以正常工作了。我还没有注意到任何副作用……

我也遇到这个问题。有什么更新吗?