在帖子中无法使用URL端口号嵌入媒体

为了让用户能够托管他们在 Discourse 帖子中嵌入的视频、音频文件等,我设置了一个 Apache 服务器,与运行 Discourse 的 Nginx 并行运行。Apache 服务器在 8008 端口上运行 http:,在 591 端口上运行 https:(IANA 端口保留用于 http-alt)。这工作正常,并且可以通过在 URL 中指定端口号从浏览器访问服务器上的内容,例如:

https://scanalyst.fourmilab.ch:591/video/f9_from_drone_ship_2022-10-12.mp4

但是,如果您尝试在 Discourse 帖子中嵌入此 URL,它会失败并显示:

抱歉,我们无法为此网页生成预览,因为找不到服务器 ‘scanalyst.fourmilab.ch’。预览将仅显示一个链接。

如果我运行 tcpdump 并监视 DNS 流量,我看到在拒绝此 URL 时没有发送任何内容。它在从未发出 DNS 查询的情况下拒绝它。如果我将 URL 中的端口号更改为 443(https: 的默认端口),它会正常发出 DNS 查询,但嵌入当然会失败,因为 Apache 服务器未在该端口上监听,并且 Discourse 服务器不知道如何处理该 URL。我在 Discourse 文档中没有看到任何表明嵌入 URL 可能不允许指定端口号的内容。

查看源代码,我在 lib/final_destination.rb 的第 362 行的 validate_uri_format 函数中发现了一个测试,该测试如下所示:

    return false if @uri.scheme == 'https' && @uri.port != 443

这似乎拒绝了使用非 443 端口的 https: URL。这似乎解释了我所看到的,所以我注释掉了这一行,但没有任何区别,即使在重新启动 Discourse 之后。当帖子出现在网站上,嵌入被转换为文本链接时,点击文本链接可以正确显示视频,所以唯一的问题是未能将其识别为嵌入并围绕它包装内联播放器。

此时我的问题是:

  • Discourse 帖子中的嵌入 URL 是否打算使用非标准端口号?
  • 如果是,是什么原因导致这些 URL 被拒绝?
  • 有什么方法可以让它们工作吗?

2017 年 3 月,这里曾就此问题进行过讨论,涉及以下两个帖子:

这些帖子暗示问题已经修复,但今天在 2.9.0.beta10 上不起作用。

感谢您对此事的任何见解和/或协助。

1 个赞