Skip to content

[Feature] 为 S3 direct-link 302 与 Web Proxy 增加显式兼容性契约 #2796

Description

@nostalume

请确认以下事项

  • 我已确认阅读并同意 AGPL-3.0 第15条 。本程序不提供任何明示或暗示的担保,使用风险由您自行承担。
  • 我已确认阅读并同意 AGPL-3.0 第16条 。无论何种情况,版权持有人或其他分发者均不对使用本程序所造成的任何损失承担责任。
  • 我确认我的描述清晰,语法礼貌,能帮助开发者快速定位问题,并符合社区规则。
  • 我已确认阅读了 OpenList文档
  • 我已确认没有重复的问题或讨论。[Feature] 为 S3 direct-link 302 与 Web Proxy 增加显式兼容性契约 #2796 是本 Issue 因未遵从模板而关闭前的版本,本次为同一 Issue 的规范化修订。
  • 我认为此问题必须由 OpenList 处理,而非第三方。
  • 我已确认此功能尚未被实现。
  • 我已确认此功能是合理的,且有普遍需求,并非我个人需要。
  • 我没有阅读这个清单,只是闭眼选中了所有的复选框,请关闭这个 Issue 。

需求描述

OpenList 的独立 S3 endpoint 在 storage 的 web_proxy=false 时,会对已认证的普通对象 GET 返回 provider direct-link 的 HTTP 302。

server/s3/redirect.go 中,redirectHandler 会设置 Location 并返回 http.StatusFound

对于某些严格的 S3 client(例如 restic),GetObject 收到跨 host 的云盘临时直链 302 后因不符合S3规范,无法读取对象。这个 redirect 不是典型的 S3 region/endpoint redirect,而是把 OpenList 的对象读取改道至 provider 的临时 URL。

将目标 storage 的 web_proxy=true 后,common.ShouldProxy() 会阻止 S3 redirect handler 返回 direct-link,OpenList 本机代理读取,兼容性问题消失。

实现思路

  1. 在 S3 文档中明确:web_proxy=false 会让 S3 GET 返回 provider direct-link 302,部分 S3 client(包括 restic)可能不兼容。
  2. 考虑为 S3 endpoint 增加独立、显式的 s3_direct_redirect opt-in;默认以本地代理返回对象内容,或至少针对 repository/workload client 保持 S3 GET 语义稳定。
  3. 在 UI 中明确 storage 的 Web Proxy 对 S3 的影响。

附加信息

这不会移除 direct-link 优化;它会让管理员能明确选择吞吐优先还是 S3 客户端兼容性优先,并避免将 302 排查成 endpoint、bucket 或 credential 问题。

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions