我有一个 @tus/server 后端和一个 React uppy 前端。上传时我收到了这样的回复
“找不到此网址的文件”
我运行多个容器,vps 在 nginx 后面。
在前端我像这样使用uppy
const [uppy] = useState(() => new Uppy().use(Tus, { endpoint: 'https://app.chatzu.ai/files/' }));
前端按顺序执行这些请求
Request URL:
https://app.chatzu.ai/files
Request Method:
POST
Status Code:
301 Moved Permanently
Remote Address:
<IP>
Referrer Policy:
strict-origin-when-cross-origin
Request URL:
https://app.chatzu.ai/files/
Request Method:
GET
Status Code:
404 Not Found
Remote Address:
<IP>
Referrer Policy:
strict-origin-when-cross-origin
Nginx 配置
location /files/ {
proxy_pass http://172.17.0.4:1080;
# Disable request and response buffering
proxy_request_buffering off;
proxy_buffering off;
proxy_http_version 1.1;
# Add X-Forwarded-* headers
proxy_set_header X-Forwarded-Host $host:$server_port;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
client_max_body_size 0;
}
和我的 tus 服务器代码
const { Server } = require('@tus/server');
const { FileStore } = require('@tus/file-store');
const express = require('express');
const host = '0.0.0.0';
const port = 1080;
const app = express();
const uploadApp = express();
const server = new Server({
path: '/files',
datastore: new FileStore({ directory: '/files' }),
});
// Middleware to log all incoming requests
uploadApp.use((req, res, next) => {
console.log(`[${new Date().toISOString()}] ${req.method} ${req.originalUrl}`);
next(); // Pass control to the next middleware or route handler
});
uploadApp.all('*', server.handle.bind(server));
app.use('/files', uploadApp);
app.listen(port, host, () => {
console.log(`Server listening on http://${host}:${port}`);
});
谢谢
location
nginx 指令文档:
如果位置由以斜杠字符结尾的前缀字符串定义,并且请求由
、proxy_pass
、fastcgi_pass
、uwsgi_pass
、scgi_pass
或memcached_pass
之一处理,则进行特殊处理。为了响应 URI 等于此字符串但没有尾部斜杠的请求,将返回带有代码 301 的永久重定向到所请求的 URI,并附加斜杠。如果不需要,可以这样定义 URI 和位置的精确匹配:grpc_pass
location /user/ { proxy_pass http://user.example.com; } location = /user { proxy_pass http://login.example.com; }
您对
/files
URI 的 POST 请求将使用 301 Moved Permanently
HTTP 重定向到 /files/
进行重定向。通过 301 或 302 HTTP 重定向进行重定向,浏览器通常会将任何其他请求方法更改为 GET
,并丢弃请求正文(您需要使用 307 或 308 HTTP 重定向来防止这种情况)。我认为你的选择是在你的node.js服务器代码中将上传路径从/files
更改为/files/
(更好),或者在你的nginx配置中将location
URI从/files/
更改为/files
(更糟糕)。