Access-Control-Allow-Origin no aparece en los encabezados de respuesta de codeigniter

Mi archivo Codeigniter dice

$CI->output->set_header("Access-Control-Allow-Origin: *"); $CI->output->set_header("Access-Control-Expose-Headers: Access-Control-Allow-Origin"); $CI->output->set_status_header(200); $CI->output->set_content_type('application/json'); echo json_encode(array("city" => "dhaka")); 

pero la respuesta http que obtengo es:

 Request URL:http://localhost/index.php/location/city Request Method:POST Status Code:200 OK Connection:Keep-Alive Content-Length:16 Content-Type:text/html Date:Sun, 22 Jul 2012 10:27:32 GMT Keep-Alive:timeout=5, max=100 Server:Apache/2.2.21 (Unix) mod_ssl/2.2.21 OpenSSL/0.9.8r DAV/2 PHP/5.3.6 X-Powered-By:PHP/5.3.6 

El encabezado Access-Control-Allow-Origin falta en la respuesta incluso después de incluir Access-Control-Expose-Headers: Access-Control-Allow-Origin . Mi fuente de información sobre este encabezado es del sitio web para desarrolladores de Mozilla

Resulta que funcionó para mí solo cuando establecí los encabezados a través del header() syntax de PHP header() lugar de la syntax codeigniter $CI->output->set_header() . Eso es triste.

Gracias al primer comentario de @Yan a la pregunta de este tema

Si observa detenidamente, también puede notar que el tipo de contenido es diferente: es text/html , mientras que usted está solicitando application/json . Esto sucede porque mientras estás preparando los encabezados correctamente, nunca los publicas. Por lo que sé, puedes hacer esto al menos de 2 maneras:

  1. Use la función set_output de la biblioteca de salida para generar todo a la vez.

     $json = json_encode(array("city" => "dhaka")); $this->output->set_header("Access-Control-Allow-Origin: *"); $this->output->set_header("Access-Control-Expose-Headers: Access-Control-Allow-Origin"); $this->output->set_status_header(200); $this->output->set_content_type('application/json'); $this->output->set_output($json); 
  2. Llame a la función _display () de la biblioteca de salida, para emitir primero los encabezados correctos y luego anexar su objeto json con eco.

     $this->output->set_header("Access-Control-Allow-Origin: *"); $this->output->set_header("Access-Control-Expose-Headers: Access-Control-Allow-Origin"); $this->output->set_status_header(200); $this->output->set_content_type('application/json'); $this->output->_display(); echo json_encode(array("city" => "dhaka")); 

    Esta función envía los datos de salida finalizados al navegador junto con los encabezados del servidor y los datos del perfil. (De CI / system / core / Output.php línea 316)

después de investigar, descubrí que $ CI-> output-> set_header () funciona, cuando no hay un error o una excepción .

Cuando hay un error o una excepción que CI puede detectar, las clases de salida y vista se omiten por completo y las páginas de error apropiadas se representan con include(VIEWPATH.'errors/'.$template.'.php') y encabezados enviados con set_status_header($status_code) (ubicado en /core/Common.php )

ver /core/Exceptions.php

aquí hay una muestra:

  /** * General Error Page * * Takes an error message as input (either as a string or an array) * and displays it using the specified template. * * @param string $heading Page heading * @param string|string[] $message Error message * @param string $template Template name * @param int $status_code (default: 500) * * @return string Error page output */ public function show_error($heading, $message, $template = 'error_general', $status_code = 500) { set_status_header($status_code); $message = '

'.implode('

', is_array($message) ? $message : array($message)).'

'; if (ob_get_level() > $this->ob_level + 1) { ob_end_flush(); } ob_start(); include(VIEWPATH.'errors/'.$template.'.php'); $buffer = ob_get_contents(); ob_end_clean(); return $buffer; }

es molesto porque hace DRY menos directo. para evitarlo, le sugiero que cree una función auxiliar, por ejemplo (no probada):

 function my_generate_headers($headers=array(),$useOutputClass=true) { if(is_array($headers) && count($headers)<1) return false; foreach($headers AS $eHeader) { ($useOutputClass) ? get_instance()->output->set_header('X-Powered-By: CCC-Cocaine') : @header('X-Powered-By: Errors',true); } return true; } 

use esa función en sus diferentes páginas de error en /errors/error_*.php , así como en sus controladores.

Lo que funcionó para mí es:

 $this->output ->set_header('Access-Control-Allow-Origin: http://localhost:4567') ->set_header('Content-type: application/json') ->set_status_header(200) ->set_output( json_encode($to_encode) ) ->_display();