Skip to content

fix: add /oss/ route forwarding and fix cvtR2Url for S3 object storage#467

Open
hyrdsetbre wants to merge 1 commit into
maillab:mainfrom
hyrdsetbre:fix/s3-storage-route
Open

fix: add /oss/ route forwarding and fix cvtR2Url for S3 object storage#467
hyrdsetbre wants to merge 1 commit into
maillab:mainfrom
hyrdsetbre:fix/s3-storage-route

Conversation

@hyrdsetbre

Copy link
Copy Markdown

问题描述

使用 S3 兼容存储(如 Backblaze B2 私有桶)时,附件上传成功但无法下载。访问 /oss/attachments/xxx.mp4 路径时,返回的是前端 HTML 页面而不是文件内容。

问题原因

  1. 后端路由问题mail-worker/src/index.js 中只转发了 /api/ 开头的请求给 Hono app 处理,/oss/ 路径没有被转发,导致该请求被前端 SPA fallback 拦截,返回了 index.html

  2. 前端 URL 生成问题mail-vue/src/utils/convert.js 中的 cvtR2Url 函数,当没有配置 r2Domain 时,直接返回了相对路径 key(如 attachments/xxx.mp4),缺少 /oss/ 前缀。

解决方案

1. 后端:添加 /oss/ 路径转发

mail-worker/src/index.jsfetch 函数中,在 /api/ 判断之后添加 /oss/ 路径的转发逻辑:

if (url.pathname.startsWith(/oss/)) {
    return app.fetch(req, env, ctx);
}

这样 /oss/ 开头的请求就会被转发给 Hono app,由 r2-api.js 中的路由处理。

2. 前端:修复 cvtR2Url 函数

mail-vue/src/utils/convert.js 中,当没有配置 r2Domain 时,使用 /oss/ 前缀路径:

if (!domain) {
    // 没有配置 R2 域名时,通过 Worker 的 /oss/ 路径代理访问
    return /oss/ + key
}

这样即使没有配置自定义域名,也能通过 Worker 代理正确访问存储的文件。

测试说明

  • 使用 Backblaze B2 私有桶配置 S3 存储
  • 上传附件成功,文件在 B2 控制台可见
  • 点击下载附件,能够正常下载文件
  • 邮件中的内嵌图片能够正常显示
  • 原有 KV 存储和 R2 存储功能不受影响

影响范围

  • 只影响 S3/R2 存储的附件访问路径
  • 不影响现有的 KV 存储方式(/static//attachments/ 路径)
  • 不影响其他 API 功能
  • 向后兼容,已配置 r2Domain 的用户不受影响

修改文件

  1. mail-worker/src/index.js - 添加 /oss/ 路径转发
  2. mail-vue/src/utils/convert.js - 修复 cvtR2Url 函数,无 r2Domain 时使用 /oss/ 前缀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant