Aktivieren Sie cors in .htaccess

71

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 CORS sofort unterstützt, 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 Fehler von 500 internen Servern aufgrund eines fehlerhaften .htaccess), aber wenn ich versuche, sie von test-cors.org zu testen , 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?

Devin Crossman
quelle
Mögliches Duplikat von Wie aktiviere ich CORS in einer Wordpress-Subdomain?
Phill Healey

Antworten:

95

Da ich sowieso alles an index.php weiterleiten ließ, 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, damit alle anderen 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']}");

}

Dank geht an slashingweapon 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');
Devin Crossman
quelle
1
Sie retten bisher vier Leben, obwohl ich dachte, ich brauche es nur header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");. Vielen Dank !
Raph77777
2
Nachdem ich die andere Antwort überprüft habe, bin ich besorgt über Ihre Lösung. Die Slashingweapon des Autors enthielt einen Kommentar, den Sie entfernt haben und der Sie dazu veranlasste, eine Logik hinzuzufügen, um zu entscheiden, ob der Ursprung ein vertrauenswürdiger Ursprung war. Hier haben Sie es blind entfernt und jeden Ursprung akzeptiert. Keine gute Praxis.
Joe
1
@ Joe guter Punkt. Ich habe die Antwort mit einem Kommentar zur Überprüfung des Ursprungs aktualisiert
Devin Crossman
84

Sollte nicht die .htaccessVerwendung addstatt set?

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"
markmarijnissen
quelle
1
Vielen Dank! das hat mein problem gelöst! Ich habe es benutzt setund es hat nicht funktioniert. Es wurde durch Hinzufügen geändert und behoben. Für das, was es wert ist, wurde dies auf einem WordPress-Blog gemacht, mit einigen anderen Sachen in der .htaccess-Datei
BBog
1
In der Dokumentation hier steht "set" enable-cors.org/server_apache.html . Vermutlich viele Probleme verursacht!
Ryan How
Ich habe von Set zu Add gewechselt und erhalte immer noch eine Antwort für Preflight. Der ungültige HTTP-Statuscode 400 ..pls schlagen vor .. habe meinen vollständigen Beitrag hier beschrieben: magento.stackexchange.com/questions/170342/…
Sushivam
Für mich hat die erste Zeile gereicht. Auch ich denke, die zweite Zeile sollte keinen Doppelpunkt haben?
kslstn
Das ist die beste Antwort !!
Hoàng Vũ Tgtt
24

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"
Jack Leon
quelle
12

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

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

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]
Levin
quelle
Ich möchte nur hinzufügen, dass die SetEnvIf-Anweisung bearbeitet werden muss, um zu definieren, welche Fernbedienungen (1xyz.com, 2xyz.com) CORS zulassen.
user1298923
8

Es sieht so aus, als würden Sie eine alte Version von slim (2.x) verwenden. Sie können .htaccess einfach die folgenden Zeilen hinzufügen und müssen in PHP-Skripten nichts 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]
Santanu Brahma
quelle
2

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);
});
Karl Adler
quelle
1

Ich habe die @ abimelex-Lösung ausprobiert, aber in Slim 3.0 sieht die Zuordnung der OPTIONS-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

Rocío García Luque
quelle