你好,
我搜索了一下,但没有找到关于此问题的任何主题。
我想禁用从外部链接下载的功能。也就是说,我并不是要限制只有注册用户才能下载,我允许任何人下载我 Discourse 站点上的资源,但我希望他们至少先访问站点并查看相关主题。
目前,如果 Discourse 上上传了某个文件,有人只需将该文件的链接发布到其他地方,其他人就可以下载它,甚至不知道它来自我的站点。请问有什么方法可以实现这一目标吗?
非常感谢。
Jian
你好,
我搜索了一下,但没有找到关于此问题的任何主题。
我想禁用从外部链接下载的功能。也就是说,我并不是要限制只有注册用户才能下载,我允许任何人下载我 Discourse 站点上的资源,但我希望他们至少先访问站点并查看相关主题。
目前,如果 Discourse 上上传了某个文件,有人只需将该文件的链接发布到其他地方,其他人就可以下载它,甚至不知道它来自我的站点。请问有什么方法可以实现这一目标吗?
非常感谢。
Jian
这或许有所帮助?
感谢您的回复。
不,这是一个不同的场景。当前的设置是限制任何未登录用户下载文件,而我想要实现的是防止其他网站通过链接下载本地资源。对于访问我网站的用户,无论是否注册,都可以进行下载。
它们在语义上是相同的东西吗?
媒体资源要么被保护,要么不被保护。如果未受保护,那么任何人都可以使用链接而无需显示您的 UI 对吧?浏览器不会关心之前访问过哪些页面。
如果这些资源很有价值,为什么不对其进行保护,并将链接分发到它们所关联的主题中呢?这将为用户提供额外动力去注册您的网站?
浏览器不会在意,但服务器可以。默认情况下,当浏览器向与包含引用页面的相同源发出请求时,它会包含一个 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 文件中添加一些内容,以便在重建时注入该配置。至于具体如何实现,我不太确定,因为尚未深入研究过。
这大概也足够了?西蒙,说得好,精彩。
如果你能添加一条规则将请求重定向到首页,那就更好了?
干杯,我原本有一段关于重定向的内容,但我已修改了之前的帖子,通过使用一个完整的示例使其更加清晰。
感谢分享,Simon。这或许能解决我的需求,不过我还不清楚如何在 Discourse 中应用它。我对 Linux 服务器和 Apache 略知一二,但 Discourse 使用的是 Docker 和 Nginx,这两者超出了我的知识范围。不过无论如何,Simon 已经为我们指明了一个方向,我会深入研究,看看能否有所作为。
原来 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