$request->ajax() 在 ajax 调用中返回 false

Car*_*zar 0 javascript ajax middleware laravel axios

我想提出一个Ajax请求有axios一个laravel controller,我想用一个middleware检查,如果request与制作ajax,但问题是,当我做出ajax request,middleware罚球false始终。

我这样打电话

axios.post('/api/contact/send', {
    ...
    data : data
}).then((response) => {
    Do somethings
}).catch(err => {
    Do somethings
})
Run Code Online (Sandbox Code Playgroud)

我的 api 路由

Route::namespace('Home')->middleware('IsAjaxRequest')->domain(env('HOST'))->group(function(){
    ....
    Route::post('contact/send','ContactController@postContact');
});
Run Code Online (Sandbox Code Playgroud)

IsAjaxRequest中间件

if(!$request->ajax()) {
    abort(403, 'Unauthorized action.');
}
return $next($request);
Run Code Online (Sandbox Code Playgroud)

和控制器

<?php

namespace App\Http\Controllers\Home;

use Illuminate\Http\Request;
use App\Events\Home\ContactMail;
use App\Http\Controllers\Controller;

use App\Http\Requests\ContactRequest;
class ContactController extends Controller
{
    //
    public function postContact(ContactRequest $request)
    {

        $data  = $request->all();
        event(new ContactMail($request->all()));
        return response()->json();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我取出middleware,一切都会正常,问题是当我检查$request->ajax()返回时false,我已经在外面middleware直接检查了它,controlelr但结果是一样的,怎么了?false如果调用是通过 ajax 进行的,为什么要返回?

apo*_*fos 6

Axios 不会发送X-Requested-WithLaravel 查找的标头以确定请求是否为 AJAX。

如果你问我,你根本不应该使用或依赖这个头文件,但(我猜)为了从 jQuery(它包含头文件)轻松迁移,基本的 Laravel 样板bootstrap.js有代码:

window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
Run Code Online (Sandbox Code Playgroud)

这确保使用 Axios 发出的所有请求都获得此标头,但是如果您不使用该文件,则需要在您自己的脚本中运行此行。