import { defineConfig } from 'vite' import https from 'node:https' import uni from '@dcloudio/vite-plugin-uni' /** 与 upload-signature 返回的 OSS 虚拟域名一致;换桶时请同步 */ const OSS_DEV_HOST = 'top-fans-test.oss-cn-shanghai.aliyuncs.com' /** * 部分环境下 Vite 内置 server.proxy 的 rewrite 对 POST 未生效,OSS 仍收到路径 * /dev-oss-proxy,从而 405(ResourceType: Object)。此处用中间件固定转发到桶根 POST /。 */ function ossDevPostProxyPlugin() { return { name: 'oss-dev-post-proxy', configureServer(server) { server.middlewares.use((req, res, next) => { const raw = req.url || '' if (!raw.startsWith('/dev-oss-proxy')) { return next() } if (req.method === 'OPTIONS') { res.statusCode = 204 res.setHeader('Access-Control-Allow-Origin', '*') res.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS') res.setHeader( 'Access-Control-Allow-Headers', String(req.headers['access-control-request-headers'] || '*') ) res.end() return } if (req.method !== 'POST') { res.statusCode = 405 res.setHeader('Content-Type', 'text/plain; charset=utf-8') res.end('OSS dev proxy only allows POST') return } const hop = new Set([ 'connection', 'keep-alive', 'proxy-authenticate', 'proxy-authorization', 'te', 'trailers', 'transfer-encoding', 'upgrade' ]) /** @type {import('node:http').OutgoingHttpHeaders} */ const headers = {} for (const [k, v] of Object.entries(req.headers)) { if (v === undefined || hop.has(k.toLowerCase())) continue headers[k] = v } headers.host = OSS_DEV_HOST const proxyReq = https.request( { hostname: OSS_DEV_HOST, port: 443, method: 'POST', path: '/', headers }, (proxyRes) => { res.writeHead(proxyRes.statusCode || 502, proxyRes.headers) proxyRes.pipe(res) } ) proxyReq.on('error', (err) => { if (!res.headersSent) { res.statusCode = 502 res.setHeader('Content-Type', 'text/plain; charset=utf-8') } res.end(err.message) }) req.pipe(proxyReq) }) } } } export default defineConfig({ plugins: [ossDevPostProxyPlugin(), uni()] })