Ошибка 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');