Express 通过多部分表单使用CSRF令牌发出的POST请求在生产上产生404错误,但在本地主机上工作
所以问题是,每当我通过一个多部分表单发出POST请求时,它都会在生产环境中发出404错误(aws ec2使用nginx作为反向代理),但在本地主机上工作正常 我的表格看起来像Express 通过多部分表单使用CSRF令牌发出的POST请求在生产上产生404错误,但在本地主机上工作,express,deployment,csrf,multipartform-data,Express,Deployment,Csrf,Multipartform Data,所以问题是,每当我通过一个多部分表单发出POST请求时,它都会在生产环境中发出404错误(aws ec2使用nginx作为反向代理),但在本地主机上工作正常 我的表格看起来像 <form name="sell" method="POST" action="/item/sell/?_csrf=<%=locals.csrfToken%>" enctype="multipart/form-data" au
<form name="sell" method="POST" action="/item/sell/?_csrf=<%=locals.csrfToken%>" enctype="multipart/form-data" autocomplete="off" class="form" role="form">
<div class="form-group">
<input name="name" class="form-control" placeholder="Enter the item name" required type="text">
</div>
<div class="form-group">
<textarea name="description" class="form-control" placeholder="Enter the item description" required type="text" rows="5" cols="30"></textarea>
</div>
<div class="form-group">
<input type="number" name="price" min="1" class="form-control" placeholder="Enter the item price" required>
</div>
<div class="form-group">
<button class="btn btn-danger btn-sm" type="submit">Submit</button>
</div>
</form>
提交
(我没有在表格中包含csrf隐藏输入)
如果我从表单中删除多部分的enctype,删除文件输入,包括csrf令牌的隐藏输入,并使action=“/item/sell”
,那么即使在生产环境中也可以正常工作。这使我确信404错误是由多部分编码引起的
但我无法找出它背后的原因,我尝试过删除nginx,但这似乎也不起作用
关于多部分表单,我发现的唯一一件事是,您需要在表单的
操作属性中包含csrf令牌,而不是将其作为输入提供。我不知道还能做些什么来让它工作。Express本机不支持multipart/formdata
。为此,您可以使用multer
等模块。在处理json正文时,您可能使用了模块正文解析器。类似地,您将需要使用一个模块来处理多部分文件上载
客户端/HTML
参考:
Express本机不支持多部分/formdata
。为此,您可以使用multer
等模块。在处理json正文时,您可能使用了模块正文解析器。类似地,您将需要使用一个模块来处理多部分文件上载
客户端/HTML
参考:
如果我在问题中没有说清楚,很抱歉,但我正在使用multer,它正在按预期工作。但是你的代码帮助我意识到服务器上没有上传/文件夹,这就是我得到404的原因。这与CSRF无关。现在问题已经解决了,谢谢。如果我在问题中没有说清楚,很抱歉,但我正在使用multer,它正在按预期工作。但是你的代码帮助我意识到服务器上没有上传/文件夹,这就是我得到404的原因。这与CSRF无关。现在问题解决了,谢谢。
<form action="/profile" method="post" enctype="multipart/form-data">
<input type="file" name="avatar" />
</form>
var express = require('express')
var multer = require('multer')
// destination folder to store the uploads
var upload = multer({ dest: 'uploads/' })
var app = express()
app.post('/profile', upload.single('avatar'), function (req, res, next) {
// req.file is the `avatar` file
// req.body will hold the text fields, if there were any
})