环境
- mac
- nginx
- vue
- php
目前在做一个文件上传的功能,但是遇到了一个很常见的问题:跨域,凭着之前的经验,检查了nginx
、php
相关的配置,发现正常。
比较奇怪的点是,除了上传大于1KB的文件,其余接口一切正常,而且1KB大小的文件可以正常上传,一旦文件大小超过1KB就会提示跨域问题。
Access to XMLHttpRequest at 'http://192.168.8.46:8081/sockjs-node/info?t=1680163878051' from origin 'http://localhost:8081' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.
上传超过1KB的文件就会报错
此时我已经将之前碰到过类似问题的解决方法都用了个遍:修改php
文件的最大上传限制,修改nginx
每次最大请求数据….这一切都不行
找遍了所以的方法,网上也没有相对应的解决办法,苦恼….
看着控制台大片的红色陷入了沉思,盯着这个域名好久,突然想到了去查询nginx
的请求日志,于是切到相对应的目录查询了日志
access.log
请求正常,然后看了一下error.log
日志,发现有如下报错信息:
2023/03/30 16:20:12 [crit] 18742#0: *58 open() "/usr/local/var/run/nginx/client_body_temp/0000000013" failed (13: Permission denied), client: 127.0.0.1, server: scrm.me, request: "POST /api/v1/upload/method/add.upload.list.html HTTP/1.1", host: "scrm.me", referrer: "http://localhost:8081/"
!!!
解决方案这不就来了么!!很明显的权限不足,直接找到这个文件所在的地方:
➜ nginx ll total 0 drwx------ 2 nobody admin 64B 3 15 00:20 client_body_temp/
可以看到,当前的文件夹没有写入的权限,我们直接赋予最高的权限即可
sudo chmod -R 777 client_body_temp
于是我去查询了这个文件是干什么用的,得到的结果是:如果客户端POST一个比较大的文件,长度超过了nginx缓冲区的大小,需要把这个文件的部分或者全部内容暂存到client_body_temp目录下的临时文件。
值得一提的是,windows下基本不会出现这样的问题,一般情况下,mac、linux环境下会出现这样权限不足的问题,遇到时将该文件夹赋予相对应高的权限即可解决问题~~