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);
});
Intenté la solución @abimelex, pero en Slim 3.0, el mapeo de las solicitudes OPTIONS es como sigue:
$app = new /Slim/App();
$app->options(''/books/{id}'', function ($request, $response, $args) {
// Return response headers
});
https://www.slimframework.com/docs/objects/router.html#options-route
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]