防止匿名用户下载与CDN不兼容的文件

我的一个网站上的 mp4 文件返回 404。

它们设置了 authorized_extensions*。文件上传正常。我在文件系统中看到了它。权限是正确的。file 命令显示它是一个 MP4 文件。Rails 中的记录看起来没问题:

[1] pry(main)> u=Upload.find(196082)
=> #<Upload:0x00005601a1b56348
   id: 196082,
   user_id: 1,
   original_filename: "PXL_20220617_184736219.mp4",
   filesize: 9328093,
   width: nil,
   height: nil,
   url: "/uploads/default/original/3X/5/6/5679d94dfce852f780afa5fcb7f1a29d810cc8fc.mp4",
   created_at: Fri, 17 Jun 2022 18:53:41.130790000 UTC +00:00,
   updated_at: Fri, 17 Jun 2022 18:53:41.176664000 UTC +00:00,
   sha1: "5679d94dfce852f780afa5fcb7f1a29d810cc8fc",
   origin: nil,
   retain_hours: nil,
   extension: "mp4",
   thumbnail_width: nil,
   thumbnail_height: nil,
   etag: nil,
   secure: false,
   access_control_post_id: nil,
   original_sha1: nil,
   verification_status: 1,
   animated: nil,
   security_last_changed_at: nil,
   security_last_changed_reason: nil>

但是访问它返回 404。最近对 mp4 有一些新功能和错误修复,但我刚刚进行了升级,它仍然无法正常工作。我不知道还能去哪里找。

问题在于 nginx 配置只允许某些文件类型。将其移至 bug。\n\n在 discourse.conf 中有此节:\n\n # this allows us to bypass rails\n location ~* \\.(gif|png|jpg|jpeg|bmp|tif|tiff|ico|webp)$ {\n add_header Access-Control-Allow-Origin *;\n try_files $uri =404;\n }\n \n\n我在容器内的 discourse.conf 中将 mp3mp4 添加到文件类型(在 webp 和 mp4 之后,现在可以正常工作)中。我在 discourse_docker config/nginx.sample.conf 中看到“bypass rails”。我不知道它如何进入 Docker 内部的模板,所以我不知道如何找出何时发生的。\n\n他们允许的文件类型是 *。我不知道是否有某种魔法可以让 mp3/mp4 在站点设置中列出它们时工作,但我看不到它如何实现。

但是,如果它不绕过 Rails,下载也应该可以正常工作。

有一个路由可以处理它

get \"uploads/:site/original/:tree:sha(.:extension)\" =\u003e \"uploads#show\", constraints: { site: /\\w+/, tree: /([a-z0-9]+\\/)+/i, sha: /\\h{40}/, extension: /[a-z0-9\\._]+/i }

并且 show 方法应该只是发送文件。nginx 配置只会通过绕过 rails 来提高效率,但这并非必需。

哦…… authorized_extensions 仅用于上传授权,而不是下载(即,不在列表中的扩展名不应阻止文件下载)。

我在最新的测试通过版本上无法重现此问题,所以你可能想将其移回 Support :wink:

编辑:我搜索了该网站,似乎你还有其他问题。

现在当我简单地使用 wget 下载文件时,它可以正常工作。

(编辑 2:这可能是因为你在 nginx 配置中添加了 mp4 扩展名?不过,对我来说,它开箱即用。)

1 个赞

谢谢!我会第一时间查看。我猜我应该尝试过安全模式!

我对那个服务工作者感到很困惑。

不是错误。

我仍然不明白那个 Service Worker 消息,但我关闭了 prevent_anons_from_downloading_files,现在它能正常工作了。看起来“prevent_anons”设置与 CDN 不兼容?

但是 CDN 没有从该网站检索上传的内容?它只是指向 www 上的某个位置

1 个赞

那么我就更困惑了。我猜那篇帖子在定义 CDN 后没有被重新烘焙。

但是 https://www.turiver.com/t/argentina-la-sociedad-perdida/117158/7909 是从 CDN 加载的,并且更改设置确实解决了问题。

我在控制台中也看到了一堆 404,但这是一个标准的双容器站点,只有这些插件:

          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-akismet.git
          - git clone https://github.com/discourse/discourse-spoiler-alert.git
          - git clone https://github.com/discourse/discourse-chat-integration.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-cakeday.git
          - git clone https://github.com/discourse/discourse-data-explorer.git
          - git clone https://github.com/discourse/discourse-checklist.git
          - git clone https://github.com/discourse/discourse-canned-replies.git
          - git clone https://github.com/discourse/discourse-chat

而且我认为您正在查看 https://www.turiver.com/t/argentina-la-sociedad-perdida/117158/8017,当我查看时,它正在从 CDN 加载,无论是否登录。