Error de HTTP OPTIONS en Codeigniter Restserver y Backbone.js de Phil Sturgeon

Mi aplicación backbone.js arroja un error HTTP OPTIONS no encontrado cuando bash guardar un modelo en mi servicio web tranquilo que está ubicado en otro host / URL.

Basado en mi investigación, deduje de esta publicación que:

una solicitud enviará constantemente un encabezado de solicitud HTTP OPTIONS y no activará la solicitud POST.

Aparentemente CORS con solicitudes que “causarán efectos secundarios en los datos del usuario” hará que su navegador “realice una comprobación previa” de la solicitud con el encabezado de la solicitud OPTIONS para verificar la aprobación, antes de enviar su método de solicitud HTTP.

Traté de evitar esto por:

  • Establecer emulateHTTP en Backbone en verdadero.

Backbone.emulateHTTP = true;

  • También permití todas las opciones de CORS y CSRF en el encabezado.

    encabezado (‘Access-Control-Allow-Origin: *’);
    encabezado (“Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept”); encabezado (“Access-Control-Allow-Methods: GET, POST, OPTIONS”);

La aplicación se bloqueó cuando se introdujo la línea de código Backbone.emulateHTTP .

¿Hay alguna manera de responder a la solicitud OPTIONS en CodeIgniter RESTServer y existen otras alternativas que permitan inhabilitar esta solicitud desde el lugar de conversación?


Encontré esto en Github como una solución. No estoy seguro de si debería usarlo ya que parece un poco desactualizado.

Encontré exactamente el mismo problema. Para resolverlo, tengo un MY_REST_Controller.php en el núcleo y todos mis controladores REST API lo usan como una clase base. Simplemente agregué un constructor como este para manejar las solicitudes 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(); } 

Esto solo comprueba si el tipo de solicitud es OPCIONES y, si es así, simplemente se apaga y devuelve un código 200 para la solicitud.

También puede modificar la propiedad $allowed_http_methods en su subclase para excluir el método de opciones. Las versiones anteriores de REST_controller no hicieron nada con OPTIONS y agregar esta línea parece imitar ese comportamiento:

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