Laravel 5.2 не распознает междоменный метод jQuery как AJAX

Laravel 5.2 не распознает запрос как AJAX из междоменного метода jQuery load():

jQuery с первого сайта:

 $('#results').load('http://site2.com/test');

Метод контроллера на сайте два:

 public function myMethod(Request $request)
    {
        header("Access-Control-Allow-Origin: *");
        header('Access-Control-Allow-Credentials: true');

        if (!$request->ajax()) {
            abort(403, 'Invalid Request');
        }
          // do something
    }

Запрос получен и не имеет никаких проблем, кроме того, что он не распознается как запрос AJAX. Метод load(), вызываемый из того же домена, распознается как AJAX.

Есть идеи?


person suncoastkid    schedule 04.02.2016    source источник
comment
Хотя вы не можете этого сделать, если только это не связано с проблемами/ограничениями безопасности в jQuery. Вы должны использовать другие альтернативы, чтобы запрос полностью функционировал должным образом, как CORS. Однако я мало что знаю о запросе CORS.   -  person Casey    schedule 04.02.2016


Ответы (2)


Класс HTTP-запроса Laravel расширяет класс Symfony, который проверяет, что для заголовка X-Requested-With запроса установлено значение «XMLHttpRequest». Этот заголовок не отправляется в междоменных запросах с jQuery по умолчанию, если вы не отключите его междоменную защиту:

$.ajax({
    url: 'http://example.com/',
    crossDomain: false
});
person tjbp    schedule 04.02.2016

Создайте файл промежуточного программного обеспечения CORS, который включает «X-Requested-With» в качестве разрешенного заголовка:

public function handle($request, Closure $next)
    {
        header('Access-Control-Allow-Origin: *');

        $headers = [
            'Access-Control-Allow-Methods' => 'POST, GET, OPTIONS, PUT, DELETE',
            'Access-Control-Allow-Headers' => 'X-Requested-With, Content-Type, X-Auth-Token, Origin, Authorization'
        ];

        if ($request->getMethod() == "OPTIONS") {
            return Response::make('OK', 200, $headers);
        }

        $response = $next($request);
        foreach ($headers as $key => $value)
            $response->header($key, $value);
        return $response;
    }

Замените метод jQuery load() на ajax() и добавьте заголовок X-Requested-With к вызову jQuery AJAX:

$.ajax({
     type: 'GET',
     url: 'http://site2.com/test',
     headers: {'X-Requested-With': 'XMLHttpRequest'},
     success: function (data)
        {
           //do something
        }
});
person suncoastkid    schedule 04.02.2016