Laravel 9.5预检(Preflight)错误排查及Stripe结账跳转问题求助
Hey,我来帮你梳理下这个预检错误的问题!从你贴出的配置和代码来看,已经做了基础的CORS配置,但还是踩了几个容易忽略的坑,咱们一步步排查:
CORS路径匹配问题
你在config/cors.php里的paths配置是['sanctum/csrf-cookie','create/order'],要注意Laravel的CORS路径匹配是严格区分斜杠的。如果前端请求的是/create/order(带前置斜杠),那当前的配置会匹配不到,导致CORS头不生效。建议改成:'paths' => ['sanctum/csrf-cookie','/create/order'],AJAX无法处理服务器端跳转(核心问题)
你在控制器里用了redirect()->away($stripe_session->url),但如果前端是通过AJAX(比如Axios、Fetch)发起的请求,浏览器是无法通过AJAX响应完成页面跳转的!而且浏览器会对这个302跳转的目标(Stripe域名)发起预检请求,但Stripe的域名不在你的CORS允许列表里,这直接触发了Preflight错误。正确的做法是把Stripe会话URL返回给前端,让前端主动跳转:
修改控制器的返回逻辑:// 替换原来的 return redirect()->away($stripe_session->url); return response()->json([ 'status' => 'success', 'stripe_checkout_url' => $stripe_session->url ]);前端示例(以Axios为例):
axios.post('/create/order', yourFormData, { withCredentials: true // 对应你配置的supports_credentials: true }) .then(res => { window.location.href = res.data.stripe_checkout_url; // 前端主动跳转到Stripe }) .catch(err => { console.error(err); alert('下单失败,请稍后重试'); });确认前端请求的Credentials设置
你在CORS配置里开了supports_credentials: true,那前端请求必须带上withCredentials: true(Axios)或者credentials: 'include'(Fetch),否则浏览器会拒绝接收响应,也可能触发预检错误。清除配置缓存
Laravel的配置缓存可能导致新的CORS配置不生效,执行以下命令清除缓存:php artisan config:clear php artisan cache:clear检查路由中间件
确认你的create/order路由有没有挂载其他中间件(比如auth:sanctum),如果有,要确保这些中间件不会提前返回响应,导致CORS头没有被正确添加到响应中。
备注:内容来源于stack exchange,提问作者Gakuru Dev

