为了让用户能够托管他们在 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 月,这里曾就此问题进行过讨论,涉及以下两个帖子:
- 为给定 IP 的可嵌入主机指定端口会导致错误
- 修复:允许嵌入主机 IP 的端口 #4759(在 GitHub 上)
这些帖子暗示问题已经修复,但今天在 2.9.0.beta10 上不起作用。
感谢您对此事的任何见解和/或协助。