POST 通过多部分表单使用 CSRF 令牌发出的请求在生产环境中出现 404 错误,但在本地主机上工作

POST request made with CSRF token through multipart form is giving 404 error on production but working on localhost

所以问题是,每当我通过多部分表单发出 POST 请求时,它会在生产环境中出现 404 错误(使用 nginx 作为反向代理的 aws ec2),但在本地主机上工作正常。

我的表格看起来像,

<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 隐藏输入)。

如果我从表单中删除 multipart 的 enctype,删除文件输入,包括 csrf 令牌的隐藏输入并生成 action="/item/sell",那么即使在生产环境中它也能正常工作。这使我确定 404 错误是由于多部分编码造成的。

但我无法弄清楚背后的原因是什么,我尝试删除 nginx,但似乎也不起作用。

关于多部分表单,我发现的唯一一件事是您需要在表单的 action 属性中包含 csrf 令牌,而不是将其作为输入提供。我不知道还能做些什么来让它发挥作用。

Express 本身不支持 multipart/formdata。您可以为此使用 multer 之类的模块。您可能在处理 json 正文时使用了模块 body-parser。同样,您将需要使用一个模块来处理多部分文件上传。

Client/HTML

<form action="/profile" method="post" enctype="multipart/form-data">
  <input type="file" name="avatar" />
</form>

Server/Express

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
})

参考: How to handle multipart uploads in express