CORS 和 Javascript 客户端问题?错了!通过自定义 API 端点上传时未正确设置 client_max_body_size

我试图通过自定义端点上传文件,并使用来自我网站的用户 API。

我只能用管理员用户登录。
除了上传文件,其他事情我都能做。

> [错误] 不允许 Origin https://my.domain 通过 Access-Control-Allow-Origin。
> [错误] 由于访问控制检查,Fetch API 无法加载 https://my.domain/m/upload.json。
> [错误] 加载资源失败:不允许 Origin https://my.domain 通过 Access-Control-Allow-Origin。(upload.json,第 0 行)
> [日志] API-CALL-ERROR – “/m/upload.json” – TypeError:不允许 Origin https://my.domain 通过 Access-Control-Allow-Origin。(app.8eb0470a.chunk.js,第 1 行)
> TypeError:不允许 Origin https://my.domain 通过 Access-Control-Allow-Origin。

我已在设置 CORS 中添加了 https://my.domainhttp://localhost:19006(用于测试),并在 app.yml 中添加了 DISCOURSE_ENABLE_CORS true

我还尝试在 app.yml 的 DISCOURSE_CORS_ORIGIN 中添加 https://my.domain,但同样没有生效。

我漏掉了什么?

我在 /shared/log/rails/production.log 中唯一看到的是 Screen Shot 2020-09-16 at 14.44.02

TL;DR
检查所有涉及的 nginx 或服务器。在我的案例中,共有 3 处:网站、Discourse Docker 容器内部以及 Docker 容器外的 nginx。client_max_body_size 应设置为上传时希望限制的大小。

我选择了 client_max_body_size 999m,只是因为我希望仅通过 Discourse 设置来限制上传大小。你可以在 nginx.conf 中的 http 或 server 标签内添加这一行。为了安全起见,我更喜欢把它加在最后一行 :slight_smile:

详细说明:
在花费整整一天时间排查并下载 Firefox 之后(强烈推荐用于 Web 开发),我发现无法上传的原因是 Discourse Docker 容器内的 nginx 设置了限制(有人可能会说“是的……但这是在重新构建 launcher 时动态设置的……”——但我喜欢确保万无一失 :))。此外,托管该 Docker 镜像的我们自己配置的 nginx 也没有设置限制,其默认值为 client_max_body_size 1MiB,这显然不够用 :)。在修改了该设置后,我还得在前端 nginx 上也进行相应调整。经过 3 处修改、6 小时折腾 nginx 中的 CORS 预检请求管理,以及些许压力,现在一切正常了。

2 个赞