Hero

Cómo habilitar CORS en Drupal 8 sin Apache Web Server

Junio 10, 2015

enzo
Drupal

Como usted quizá sabe Drupal 8 está casi listo para ser lanzado, y podría ser en el próximo DrupalCon Europa celebrado en Barcelona.

Sin embargo, si usted está interesado en aplicaciones CORS usted debe esperar hasta Drupal 8.1 para obtener soporte nativo para CORS en Drupal más información ver el issue #1869548.

Hace algún tiempo hice un webinar Entendiendo Drupal 8 Rest y Backbone.Drupal para hacer llamados CORS, pero ese enfoque sólo funciona en entornos que utilizan Apache Web Server, pero, en servidores utilizando un servidor web como Ngix esa solución no sirve para nada. Hoy me enfrento a ese problema usando el hosting de Panteon.

Por lo tanto, he implementado una solución que hackear el archivo index.php para permitir CORS 😎. Permítanme dividir el cambio en dos etapas.

  1. Habilitar REST OPTIONS.

Primero debemos que garantizar que el método REST OPTIONS devuelva el valor correcto, porque Drupal 8 aun no puede manejar esta solicitud en este momento, voy a mostrarle como forzar este soporte como se muestra a continuación.

if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    $response = new Response(200);
    $response->headers->set('Access-Control-Allow-Origin', '*');
    $response->headers->set('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PATCH, DELETE');
    $response->headers->set('Access-Control-Allow-Headers', 'Authorization');
    $response->send();
    exit;
}
  1. Habilitar origen de solicitudes.

Es necesario modificar las peticiones normales para permitir peticiones remotas desde cualquier fuente deseada, como se puede ver en el siguiente fragmento de código:

$response = $kernel
      ->handle($request)
      // Handle the response object.
      ->prepare($request);

  // Enable CORS requests, Change '*' for any specific domain or ip address
  $response->headers->set('Access-Control-Allow-Origin', '*');
  $response->headers->set('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PATCH, DELETE');
  $response->headers->set('Access-Control-Allow-Headers', 'Authorization');

Puede aplicar este parche contra Drupal 8 beta 10.

Sé que hay iniciativas que permitan a esta función mediante módulos contribuidos, pero mientras tengamos una solución definitiva, esta es una solución temporal lo suficientemente flexible utilizando el estilo de Drupal 8, para empezar a usar Drupal como backend en una solución headless Drupal.

Espero que hayas encontrado este articulo útil.

Recibe consejos y oportunidades de trabajo 100% remotas y en dólares de weKnow Inc.