可以禁止从外部链接下载吗?

你好,

我搜索了一下,但没有找到关于此问题的任何主题。

我想禁用从外部链接下载的功能。也就是说,我并不是要限制只有注册用户才能下载,我允许任何人下载我 Discourse 站点上的资源,但我希望他们至少先访问站点并查看相关主题。

目前,如果 Discourse 上上传了某个文件,有人只需将该文件的链接发布到其他地方,其他人就可以下载它,甚至不知道它来自我的站点。请问有什么方法可以实现这一目标吗?

非常感谢。
Jian

2 个赞

这或许有所帮助?

3 个赞

感谢您的回复。

不,这是一个不同的场景。当前的设置是限制任何未登录用户下载文件,而我想要实现的是防止其他网站通过链接下载本地资源。对于访问我网站的用户,无论是否注册,都可以进行下载。

1 个赞

它们在语义上是相同的东西吗?

媒体资源要么被保护,要么不被保护。如果未受保护,那么任何人都可以使用链接而无需显示您的 UI 对吧?浏览器不会关心之前访问过哪些页面。

如果这些资源很有价值,为什么不对其进行保护,并将链接分发到它们所关联的主题中呢?这将为用户提供额外动力去注册您的网站?

1 个赞

浏览器不会在意,但服务器可以。默认情况下,当浏览器向与包含引用页面的相同源发出请求时,它会包含一个 Referer 头,告知服务器它来自何处。服务器可以利用此信息来影响行为,包括允许或拒绝访问某些位置。

绕过这一限制很容易,但它能防止来自其他网站的随意链接。

location /uploads/ {
    valid_referers  www.example.com;
    if ($invalid_referer) {
        return 403;
    }
}

将上述代码中的 www.example.com 替换为您 Discourse 实例的域名,应该是防止热链接到您实例上传文件的合适的 nginx 配置。

您可能还想采取不同于返回 403(不允许)的操作,例如重定向到您的 Discourse 主页。为此,您可以使用以下代码:

location /uploads/ {
    valid_referers  www.example.com;
    if ($invalid_referer) {
        return 307 /;
    }
}

应该可以在您的 app.yml 文件中添加一些内容,以便在重建时注入该配置。至于具体如何实现,我不太确定,因为尚未深入研究过。

4 个赞

这大概也足够了?西蒙,说得好,精彩。

如果你能添加一条规则将请求重定向到首页,那就更好了?

3 个赞

干杯,我原本有一段关于重定向的内容,但我已修改了之前的帖子,通过使用一个完整的示例使其更加清晰。

1 个赞

感谢分享,Simon。这或许能解决我的需求,不过我还不清楚如何在 Discourse 中应用它。我对 Linux 服务器和 Apache 略知一二,但 Discourse 使用的是 Docker 和 Nginx,这两者超出了我的知识范围。不过无论如何,Simon 已经为我们指明了一个方向,我会深入研究,看看能否有所作为。

1 个赞

原来 Discourse 用于 nginx 的配置中已经包含了针对热链接的设置,只不过被注释掉了。因此,您可以在 app.yml 文件中添加几条替换指令,以取消这些行的注释。

使用您喜欢的编辑器编辑 /var/discourse/containers/app.yml。在文件末尾,您会找到一个 run 部分,在该部分的最后有一个执行 echo “end of custom commands” 的命令。

在该执行命令之前,添加以下行:

  - replace:
      filename: "/etc/nginx/conf.d/discourse.conf"
      from: "#valid_referers none blocked mysite.com *.mysite.com;"
      to: valid_referers none blocked mysite.com *.mysite.com;

  - replace:
      filename: "/etc/nginx/conf.d/discourse.conf"
      from: "#if ($invalid_referer) { return 403; }"
      to: if ($invalid_referer) { return 307 /; }

在第一个替换部分中,您会看到“to:”行中包含 mysite.com *.mysite.com,请将它们替换为您自己的域名,例如 discourse.org *.discourse.org。第二个替换假设您希望将访问者重定向到 Discourse 主页。

保存更改后,运行以下命令以使用更新后的 nginx 配置重建 Discourse。

cd /var/discourse
./launcher rebuild app
4 个赞