wake-up-neo.com

Aktivieren Sie cors in .htaccess

Ich habe einen grundlegenden RESTful-Dienst mit dem SLIM PHP Framework erstellt und versuche nun, ihn so zu verkabeln, dass ich von einem Angular.js-Projekt aus auf den Dienst zugreifen kann. Ich habe gelesen, dass = Angular unterstützt CORS von Haus aus und alles, was ich tun musste, war diese Zeile hinzuzufügen: Header set Access-Control-Allow-Origin "*" zu meiner .htaccess-Datei.

Ich habe dies getan und meine REST Anwendung funktioniert immer noch (kein 500er interner Serverfehler aufgrund eines schlechten .htaccess), aber wenn ich versuche, es von test-cors.org) aus zu testen Es wird ein Fehler ausgegeben.

Fired XHR event: loadstart
Fired XHR event: readystatechange
Fired XHR event: error

XHR status: 0
XHR status text: 
Fired XHR event: loadend

Meine .htaccess-Datei sieht so aus

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"

Muss ich meinem .htaccess noch etwas hinzufügen, damit dies ordnungsgemäß funktioniert, oder gibt es eine andere Möglichkeit, CORS auf meinem Server zu aktivieren?

56
Devin Crossman

Da sowieso alles an index.php weitergeleitet wurde, dachte ich, ich würde versuchen, die Header in PHP anstelle der .htaccess-Datei zu setzen, und es funktionierte! YAY! Folgendes habe ich zu index.php hinzugefügt für alle anderen, die dieses Problem haben.

// 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']}");

}

gutschrift geht an Hiebwaffe für seine Antwort auf diese Frage

Da ich Slim verwende, habe ich diese Route hinzugefügt, damit OPTIONS-Anforderungen eine HTTP 200-Antwort erhalten

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

Sollte das nicht .htaccess benutze add anstelle von set?

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

Das hat bei mir funktioniert:

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"
15
Jack Leon

Wie in dieser Antwort Benutzerdefinierter HTTP-Header für eine bestimmte Datei können Sie <File>, um CORS für eine einzelne Datei mit diesem Code zu aktivieren:

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

Es sieht so aus, als ob Sie eine alte Version von slim (2.x) verwenden. Sie können einfach die folgenden Zeilen zu .htaccess hinzufügen und müssen nichts in PHP Skripten tun.

# 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]
6
Santanu Brahma

Wird zu 100% funktionieren, bewerben Sie sich in .htaccess:

# Enable cross domain access control
SetEnvIf Origin "^http(s)?://(.+\.)?(1xyz\.com|2xyz\.com)$" 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, OPTIONS"
Header always set Access-Control-Allow-Headers "x-test-header, Origin, X-Requested-With, Content-Type, Accept"

# Force to request 200 for options
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule .* / [R=200,L]
4
levin

Dank Devin habe ich die Lösung für meine SLIM-Anwendung mit Multi-Domain-Zugriff gefunden.

In 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

in 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);
});
2
Karl Adler

Ich habe @abimelex-Lösung ausprobiert, aber in Slim 3.0 sieht die Zuordnung der OPTIONEN-Anforderungen folgendermaßen aus:

$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