同样的问题也出现在我们这里。我们有一些 js 文件在我们自己的软件中运行,这些文件绝不会在浏览器中执行任何操作。
我们通过将所有上传内容移至 S3 存储桶并将 s3_use_cdn_url_for_all_uploads 设置为 true,成功解决了 Discourse 的下载问题。这实际上绕过了短 URL 控制器,而该控制器似乎是导致 js 文件无法使用的根本原因。
具体步骤(由我的 AI 指导我完成):
- 设置 S3 兼容存储(例如 Cloudflare R2)
Discourse 无法安全地从本地磁盘提供 .js 文件。请将其移至存储桶。
-
存储桶:创建一个私有存储桶(例如
my-discourse-bucket)。 -
API 密钥:生成访问密钥和密钥。
2. 配置自定义 CDN 域名
在 Cloudflare(或您的提供商)中,将自定义域名连接到您的存储桶(例如 cdn.example.com)。这确保文件通过直接 URL 作为静态资源提供,从而绕过 Discourse 的“安全卫士”。
3. 更新 Discourse 设置
在 管理 → 设置 中配置您的 S3 详细信息。关键的是,启用以下选项以确保 Discourse 不会尝试使用可能破坏链接的临时标头来“签名”URL:
-
s3_use_cdn_url_for_all_uploads:勾选此框(这是最重要的步骤)。 -
s3_cdn_url:设置为https://cdn.example.com。 -
s3_region:使用us-east-1(适用于 R2 兼容性)。
4. 迁移现有上传(可选)
注意:由于未知原因,此方法对我们无效。
要修复现有帖子中的旧链接,请进入您的容器并运行:
Bash
# 在 /var/discourse 内
./launcher enter app
rake uploads:migrate_to_s3
rake posts:rebake
希望这对大家有所帮助。