Подтвердить что ты не робот

Laravel обрабатывает запрос метода OPTION http

Я разрабатываю приложение angularjs, которое использует laravel в качестве своего серверного сервера. У меня возникли проблемы с доступом к данным из laravel, поскольку перед каждым запросом GET angular сначала отправляет запрос OPTION, как показано ниже

OPTIONS /61028/index.php/api/categories HTTP/1.1
Host: localhost
Connection: keep-alive
Cache-Control: max-age=0
Access-Control-Request-Method: GET
Origin: http://localhost:3501
Access-Control-Request-Headers: origin, x-requested-with, accept
Accept: */*
Referer: http://localhost:3501/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: UTF-8,*;q=0.5

Я попытался ответить на это, добавив следующий код в фильтр before

    if (Request::getMethod() == "OPTIONS") {
     $headers = array(
       'Access-Control-Allow-Origin' =>' *',
       'Access-Control-Allow-Methods'=>' POST, GET, OPTIONS, PUT, DELETE',
       'Access-Control-Allow-Headers'=>'X-Requested-With, content-type',);
      return Response::make('', 200, $headers);
    }

Это создает ответ с заголовками

Content-Encoding: gzip
X-Powered-By: PHP/5.3.5-1ubuntu7.11
Connection: Keep-Alive
Content-Length: 20
Keep-Alive: timeout=15, max=97
Server: Apache/2.2.17 (Ubuntu)
Vary: Accept-Encoding
access-control-allow-methods: POST, GET, OPTIONS, PUT, DELETE
Content-Type: text/html; charset=UTF-8
access-control-allow-origin: *
cache-control: no-cache
access-control-allow-headers: X-Requested-With, content-type

Хотя заголовки установлены, браузер по-прежнему выдает ошибку

XMLHttpRequest cannot load http://localhost/61028/index.php/api/categories. Origin http://localhost:3501 is not allowed by Access-Control-Allow-Origin.

Я также попробовал установить источник разрешения в начало, представленный в заголовке запроса, как показано ниже

    $origin=Request::header('origin');
    //then within the headers
    'Access-Control-Allow-Origin' =>' '.$origin[0],

и по-прежнему та же ошибка Что я делаю не так? Любая помощь приветствуется.

Изменить 1

В настоящее время я использую очень уродливый хак, где я запускаю инициализацию laravels при получении запроса OPTIONS. Это я сделал в index.php

<?php
if ($_SERVER['REQUEST_METHOD']=='OPTIONS') {
header('Access-Control-Allow-Origin : *');
header('Access-Control-Allow-Methods : POST, GET, OPTIONS, PUT, DELETE');
header('Access-Control-Allow-Headers : X-Requested-With, content-type');
}else{
/**
 * Laravel - A PHP Framework For Web Artisans
 *
 * @package  Laravel
 * @version  3.2.13
 * @author   Taylor Otwell <[email protected]>
 * @link     http://laravel.com
 */

Мне также пришлось добавить заголовок allow-origin в фильтр before.

Я знаю, что это не умно, но пока это мое единственное решение

4b9b3361

Ответ 1

Это со ссылкой на ваш вопрос относительно вышеупомянутой проблемы. Вы не упомянули версию laravel и angularJS. Я предполагаю, что вы используете самые лучшие угловые и Laravel. Я также предполагаю, что angular размещен на http://localhost: 3501, а laravel размещен на http://localhost Просто выполните следующие шаги.

  • Поместите ниже блок кода в файл /public/.htaccess laravel

    Header set Access-Control-Allow-Origin "http://localhost:3501"
    Header set Access-Control-Allow-Methods "GET,POST,PUT,DELETE,OPTIONS"
    Header set Access-Control-Allow-Credentials "true"
    
  • Поместите строку ниже в конфигурацию angular

    $httpProvider.defaults.withCredentials = true;
    

Никогда не используйте * как символ дикой карты. Larvel не может определить домен для управления сеансом. Поэтому установите http://localhost: 3501 как полное доменное имя Access-Control-Allow-Origin. Я думаю, это поможет вам.

Ответ 2

Это ошибка в Laravel, которая недавно получила исправлена ​​. Вы можете обновить до последней версии.

Кроме того, вам необходимо включить поддержку CORS для вашего сервера.

Ответ 3

добавьте это в свой файл index.php

header('Access-Control-Allow-Origin: *'); 
header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');