Laravel 5.5无法禁用VerifyCsrfToken检查,跨域POST遇302问题求助
解决Laravel 5.4跨域POST请求返回302的问题
嘿,我来帮你捋捋这个头疼的问题!你已经把/create-order加到了CSRF排除列表,但还是收到302重定向,大概率不是CSRF的锅,反而更可能是跨域配置缺失或者路由/中间件的其他小问题,咱们一步步排查:
1. 先确认CSRF排除是否真的生效
首先得确保你改对了地方:
- 打开
app/Http/Middleware/VerifyCsrfToken.php,检查$except数组是不是真的加对了路由:protected $except = [ '/create-order', ]; - 注意!Laravel路由是区分大小写的,要是你PhoneGap里请求的是
/Create-Order或者/create_order,那就完全不匹配,得严格保持一致。
2. 重点排查跨域(CORS)配置
PhoneGap属于前端跨域请求,浏览器(或者WebView)会先发一个OPTIONS预检请求,Laravel默认没处理这种请求,就会导致重定向或者报错,这是最常见的原因:
方法一:用laravel-cors包快速解决
- 先安装包:
composer require barryvdh/laravel-cors - 在
config/app.php的providers数组里添加:Barryvdh\Cors\ServiceProvider::class, - 发布配置文件:
php artisan vendor:publish --provider="Barryvdh\Cors\ServiceProvider" - 最后在
app/Http/Kernel.php的$middleware全局中间数组里加入:
这样所有请求都会自动处理跨域头了。\Barryvdh\Cors\HandleCors::class,
方法二:手动添加跨域头(临时方案)
如果你不想装包,可以在VerifyCsrfToken中间件里手动处理:
public function handle($request, Closure $next) { // 先处理OPTIONS预检请求 if ($request->isMethod('OPTIONS')) { $response = response('', 200); } else { $response = $next($request); } // 设置跨域头,生产环境别用*,指定你的PhoneGap应用域名 $response->header('Access-Control-Allow-Origin', '*'); $response->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); $response->header('Access-Control-Allow-Headers', 'Content-Type, Authorization'); return $response; }
3. 检查路由的请求方法是否匹配
确认你的路由定义是POST方法,要是写成GET或者其他,Laravel会自动重定向:
// 正确示例:接收POST请求 Route::post('/create-order', [YourController::class, 'createOrder']);
4. 排查其他中间件的干扰
比如auth中间件,如果你的路由加了这个,但PhoneGap请求没带登录凭证,就会被重定向到登录页,返回302:
// 错误示例:不需要登录的路由加了auth中间件 Route::post('/create-order', [YourController::class, 'createOrder'])->middleware('auth');
要是这个接口不需要登录,直接把->middleware('auth')去掉就行。
补充:PhoneGap里获取CSRF Token的方案
其实你也可以不用排除CSRF,更安全的做法是:
- 先给PhoneGap发一个GET请求到服务器(比如首页),从响应的Cookie里取出
XSRF-TOKEN; - 在后续的POST请求头里添加
X-XSRF-TOKEN,值就是刚才取到的Token; - 注意要配置CORS允许携带凭证(设置
Access-Control-Allow-Credentials: true,并且Access-Control-Allow-Origin不能用*,要指定具体域名)。
内容的提问来源于stack exchange,提问作者Meddie
相关产品推荐
相关产品推荐

