origin htaccess headers enabled enable php apache .htaccess cors slim

php - headers - habilitar cors en.htaccess



htaccess origin (7)

¿No debería el .htaccess usar add lugar de set ?

Header add Access-Control-Allow-Origin "*" Header add Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"

Creé un servicio RESTful básico con el framework SLIM PHP y ahora estoy intentando conectarlo para poder acceder al servicio desde un proyecto Angular.js. He leído que Angular admite CORS de fábrica y todo lo que necesitaba hacer era agregar esta línea: El Header set Access-Control-Allow-Origin "*" en mi archivo .htaccess.

He hecho esto y mi aplicación REST sigue funcionando (no hay 500 errores del servidor interno desde un .htaccess malo) pero cuando trato de probarlo desde test-cors.org arroja un error.

Fired XHR event: loadstart Fired XHR event: readystatechange Fired XHR event: error XHR status: 0 XHR status text: Fired XHR event: loadend

Mi archivo .htaccess se ve así

RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ /index.php [QSA,L] Header set Access-Control-Allow-Origin "*" Header set Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"

¿Hay algo más que deba agregar a mi .htaccess para que esto funcione correctamente o hay otra forma de habilitar CORS en mi servidor?


Como de todos modos tenía todo reenviado a index.php, pensé que intentaría configurar los encabezados en PHP en lugar del archivo .htaccess ¡y funcionó! ¡HURRA! Esto es lo que agregué a index.php para cualquier otra persona que tenga este problema.

// Allow from any origin if (isset($_SERVER[''HTTP_ORIGIN''])) { // should do a check here to match $_SERVER[''HTTP_ORIGIN''] to a // whitelist of safe domains header("Access-Control-Allow-Origin: {$_SERVER[''HTTP_ORIGIN'']}"); header(''Access-Control-Allow-Credentials: true''); header(''Access-Control-Max-Age: 86400''); // cache for 1 day } // Access-Control headers are received during OPTIONS requests if ($_SERVER[''REQUEST_METHOD''] == ''OPTIONS'') { if (isset($_SERVER[''HTTP_ACCESS_CONTROL_REQUEST_METHOD''])) header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS"); if (isset($_SERVER[''HTTP_ACCESS_CONTROL_REQUEST_HEADERS''])) header("Access-Control-Allow-Headers: {$_SERVER[''HTTP_ACCESS_CONTROL_REQUEST_HEADERS'']}"); }

el crédito va a slashingweapon por su respuesta a esta pregunta

Como uso Slim, agregué esta ruta para que las solicitudes OPTIONS obtengan una respuesta HTTP 200

// return HTTP 200 for HTTP OPTIONS requests $app->map(''/:x+'', function($x) { http_response_code(200); })->via(''OPTIONS'');


Como en esta respuesta, encabezado HTTP personalizado para un archivo específico , puede usar <File> para habilitar CORS para un solo archivo con este código:

<Files "index.php"> Header set Access-Control-Allow-Origin "*" Header set Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT" </Files>


Esto es lo que funcionó para mí:

Header add Access-Control-Allow-Origin "*" Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type" Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"


Gracias a Devin, descubrí la solución para mi aplicación SLIM con acceso multidominio.

En htaccess:

SetEnvIf Origin "http(s)?://(www/.)?(allowed.domain.one|allowed.domain.two)$" AccessControlAllowOrigin=$0$1 Header set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin Header set Access-Control-Allow-Credentials true

en index.php

// Access-Control headers are received during OPTIONS requests if ($_SERVER[''REQUEST_METHOD''] == ''OPTIONS'') { if (isset($_SERVER[''HTTP_ACCESS_CONTROL_REQUEST_METHOD''])) header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS"); if (isset($_SERVER[''HTTP_ACCESS_CONTROL_REQUEST_HEADERS''])) header("Access-Control-Allow-Headers: {$_SERVER[''HTTP_ACCESS_CONTROL_REQUEST_HEADERS'']}"); } // instead of mapping: $app->options(''/(:x+)'', function() use ($app) { //...return correct headers... $app->response->setStatus(200); });



Parece que estás usando una versión anterior de slim (2.x). Simplemente puede agregar las siguientes líneas a .htaccess y no necesita hacer nada en los scripts de PHP.

# Enable cross domain access control SetEnvIf Origin "^http(s)?://(.+/.)?(domain_one/.com|domain_two/.net)$" REQUEST_ORIGIN=$0 Header always set Access-Control-Allow-Origin %{REQUEST_ORIGIN}e env=REQUEST_ORIGIN Header always set Access-Control-Allow-Methods "GET, POST, PUT, DELETE" Header always set Access-Control-Allow-Headers: Authorization # Force to request 200 for options RewriteEngine On RewriteCond %{REQUEST_METHOD} OPTIONS RewriteRule .* / [R=200,L]