大家好,
我遇到了一个特定问题:我的 Discourse 实例(标准的 Docker 安装)上,大于 5MB 的视频无法生成 Onebox 预览,而相同的视频链接在其他 Discourse 站点上工作得非常完美。
问题:
当我发布一个视频链接(例如一个 5.1MB 的 .webm 文件)时,Onebox 失败了。我已经将问题隔离到 Range 请求协商失败。
从 Rails 控制台得到的调试结果:
- 手动 Ruby 测试(成功): 使用标准的
Net::HTTP并手动设置Range: bytes=0-10标头,我成功地从源服务器获得了 206 Partial Content 响应。 - Discourse 系统测试(失败): 当 Discourse 尝试通过
FinalDestination.new(url).get获取同一 URL 时,它收到了 200 OK (Net::HTTPOK) 响应,而不是 206。因此,它尝试下载整个文件,达到了 5MB 的MAX_REQUEST_SIZE_BYTES限制,Onebox 以“大小超出限制”错误失败。
我已经测试了以下配置,但问题仍然存在:
- 在
onebox_user_agent中设置了类似浏览器的字符串。 - 将源域添加到
force_custom_user_agent_hosts。 - 验证服务器没有配置全局代理(
env | grep -i proxy为空)。 - 在其他 Discourse 实例上测试了相同的 URL,它们可以完美地 Onebox。
问题:
为什么一个 Discourse 实例无法协商 Range 请求(206),而指向完全相同 URL 的另一个实例在同一网络上却能成功?
是否有任何特定的内部配置、安全中间件或 FinalDestination 逻辑可能会剥离 Range 标头或导致远程服务器回退到完整的 200 响应?
非常感谢任何见解或下一步的查找方向!