Ошибка HTTP OPTIONS в Phil Sturgeon Codeigniter Restserver и Backbone.js

My backbone.js приложение, бросающее ошибку HTTP OPTIONS, не обнаружено, когда я пытаюсь сохранить модель для моей спокойной веб-службы, расположенной на другом хосте/URL-адресе.

Основываясь на моих исследованиях, я собрал из этого сообщения , что:

запрос будет постоянно отправлять заголовок запроса OPTIONS http и вообще не запускать запрос POST.

По-видимому, CORS с запросами, которые будут "вызывать побочные эффекты для пользовательских данных", заставит ваш браузер "предварять" запрос с заголовком запроса OPTIONS, чтобы проверить утверждение, прежде чем фактически отправить ваш запрошенный метод HTTP-запроса.

Я попытался обойти это:

  • Настройка emulateHTTP в Backbone на true.

Backbone.emulateHTTP = true;

  • Я также разрешил разрешать все варианты CORS и CSRF в заголовке.

    header ('Access-Control-Allow-Origin: *')

    header ( "Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept" ); header ( "Access-Control-Allow-Methods: GET, POST, OPTIONS" );

Приложение разбилось, когда была введена строка кода Backbone.emulateHTTP.

Есть ли способ ответить на запрос OPTIONS в RESTServer CodeIgniter и есть ли другие альтернативы, позволяющие либо отключить этот запрос из места разговора?


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

Ответ 1

Я столкнулся с той же проблемой. Для его решения у меня есть MY_REST_Controller.php в ядре, и все мои контроллеры REST API используют его как базовый класс. Я просто добавил такой конструктор для обработки запросов OPTIONS.

function __construct() {

    header('Access-Control-Allow-Origin: *');
    header("Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method");
    header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
    $method = $_SERVER['REQUEST_METHOD'];
    if($method == "OPTIONS") {
        die();
    }
    parent::__construct();
}

Это просто проверяет, является ли тип запроса OPTIONS, и если это так просто исчезает, который возвращает код 200 для запроса.

Ответ 2

Вы также можете изменить свойство $allowed_http_methods в своем подклассе, чтобы исключить метод опций. Предыдущие версии REST_controller ничего не делали с OPTIONS, и добавление этой строки, похоже, имитирует это поведение:

protected $allowed_http_methods = array('get', 'delete', 'post', 'put');