使用Axios发送Authorization头请求失败,遇OPTIONS状态0错误(PHP服务端)
我之前也碰到过几乎一模一样的跨域问题,结合你的描述来看,核心问题大概率出在CORS预检请求(OPTIONS)的处理细节上,虽然你说服务端已经允许了所有请求头和方法,但实际配置可能还有遗漏,或者axios的请求头设置有小坑。下面是我整理的几个排查和解决方向:
1. 检查PHP服务端的CORS配置,别只依赖*
很多人以为设置Access-Control-Allow-Headers: *就能覆盖所有自定义头,但实际上当请求携带Authorization这类非标准头时,部分浏览器(比如Chrome)不会正确解析通配符,必须明确指定允许的头。
建议把服务端的CORS配置改成这样:
// 允许前端域名(生产环境别用*,替换成你的实际前端地址更安全) header("Access-Control-Allow-Origin: *"); // 明确允许的请求方法 header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE"); // 必须包含Authorization和Content-Type,不能省略 header("Access-Control-Allow-Headers: Content-Type, Authorization"); // 关键:OPTIONS预检请求直接返回200,不需要走业务逻辑 if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit(); }
如果你用了PHP框架(比如Laravel、ThinkPHP),别自己手动写header,用框架自带的CORS中间件,避免和框架的响应处理冲突。
2. 调整Axios的请求头设置,别手动指定multipart/form-data
当你发送FormData类型的请求时,Axios会自动识别并设置正确的Content-Type(带boundary分隔符的格式),手动指定Content-Type: multipart/form-data反而会破坏这个自动处理,导致预检请求异常。
修改你的请求代码,去掉手动设置的Content-Type:
axios.post(`${API_URL}users/${23}/profile/main/update`, formData, { headers: { Authorization: `Bearer ${token}` // 删掉Content-Type,让Axios自动处理 } })
3. 用浏览器控制台排查预检请求细节
状态码0通常意味着请求被浏览器的CORS策略拦截了,你可以打开浏览器开发者工具的Network标签,找到那个失败的OPTIONS请求,查看它的响应头:
- 确认
Access-Control-Allow-Headers里确实包含Authorization - 确认OPTIONS请求的响应状态是200,而不是其他错误码
如果OPTIONS请求根本没到达你的PHP服务端,那可能是反向代理(比如Nginx)没正确转发请求,这时候需要在代理层也配置CORS规则。
4. 其他小排查点
- 确认你的
token不是空值或者格式错误(虽然这不会直接导致OPTIONS失败,但可以排除后续业务层的问题) - 本地开发时别用
file://协议打开前端页面,用localhost或者本地服务器(比如http-server)访问,避免浏览器的本地文件安全限制
内容的提问来源于stack exchange,提问作者Konstantin
相关产品推荐
相关产品推荐

