如何丢弃带有空用户代理的请求?

我的 Discourse 网站收到了很多用户代理为空的恶意机器人/爬虫的访问。通常我会编辑 nginx 配置来处理这个问题,但在使用 Docker 安装方法时无法访问它。如果可以避免的话,我不想再添加一个反向代理来处理这个问题。

1 个赞

您可以参考 discourse_docker/templates/web.ratelimited.template.yml at main · discourse/discourse_docker · GitHub 来了解如何在容器内修改 nginx 配置。

5 个赞

如果其他人想专门做这件事,我创建了 /var/discourse/templates/web.blockemptyua.yml,内容如下:

run:
  - replace:
     filename: "/etc/nginx/conf.d/discourse.conf"
     from: /listen 443 ssl http2;/
     to: |
       listen 443 ssl http2;
       if ($http_user_agent = "") { return 403; }

然后在 /var/discourse/containers/app.yml 中,我将这个新的模板文件添加到了文件顶部的模板列表的末尾,然后运行 ./launcher rebuild app

Nginx 现在会拒绝所有 UA 为空的请求。

编辑:已将匹配/替换移到更好的位置。

4 个赞

我不知道 Docker,所以为了安全起见,因为我每次看到 replace 都会感到紧张……

这不是完全替换 discourse.conf 的内容,而是添加内容,对吗?

它会替换文件中的一行。它会找到第一个实例:

listen 443 ssl http2;

并将其替换为:

listen 443 ssl http2;
if ($http_user_agent = "") { return 403; }

这样我们只是在正确的位置向文件中添加一个新行。文件的其余部分都不会被触及。它使用与官方模板相同的机制来安全地修补文件。

2 个赞

正如我之前所说,我不知道 Docker。我只是一个只会复制粘贴的普通用户,拥有博士学位。

因此,给未来搜索者的一个提示:

web.blockemptyua.yml 不能是声明模板的第一个。更准确地说,它必须出现在 web.template.yml 之后(或者甚至在所有 web.* 模板之后)。

我认为这里的顺序很重要,如果我们尝试将其作为第一个模板,重建/引导将因错误而停止,因为那时还没有 /etc/nginx/conf.d/discourse.conf 文件。

嗯,每天都有新东西 :wink:

1 个赞

确实,它需要放在最后。我已经编辑了我的帖子以包含它 :+1:

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.