CORS funktioniert nicht im php slim framework
Habe ich erstellt rest-api mit php slim framework.
Hier ist mein code
<?php
require 'Slim/Slim.php';
require '../lib/cors_enable.php';
require '../lib/logger.php';
require '../../db_config/config.php';
require '../lib/predis-0.8/lib/Predis/Autoloader.php';
Predis\Autoloader::register();
require '../lib/RedisMethods.php';
require '../lib/APICaller.php';
require '../lib/FosterGemOAuth.php';
require '../lib/FosterGemUser.php';
require '../lib/NewsFeed.php';
require '../lib/FosterGemBookmarks.php';
require '../lib/TopicWebsite.php';
require '../lib/FetchFullArticle.php';
require '../lib/PushNotification.php';
\Slim\Slim::registerAutoloader();
$app = new \Slim\Slim();
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
//return only the headers and not the content
//only allow CORS if we're doing a GET - i.e. no saving for now.
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'])) {
if($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'] == 'GET' || $_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'] == 'POST') {
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: X-Requested-With, X-authentication,Content-Type, X-client');
}
}
exit;
}
$app->post('/messagebhej(/)(:profile_id/?)(:app_auth_token/?)', 'messagebhej');
$app->post('/login','login');
$app->run();
function messagebhej($profile_id, $app_auth_token){
$error='';
$request = file_get_contents('php://input');
try {
$request_data = json_decode($request,true);
if($app_auth_token == APP_AUTH_TOKEN){
$obj = new PushNotification();
$res = $obj->sendMessage($profile_id, $request_data);
} else {
$error='Access Denied';
}
} catch (Exception $ex) {
$error=$ex->getMessage();
log_error($error,"index.php | sendMessage function");
}
if($error) {
$return_data= '{"Status":"Failed","Message":"'.$error.'"}';
} else {
$return_data='{"Status":"Success"}';
}
echo $return_data;
}
function login() {
$error='';
$request = file_get_contents('php://input');
try {
$request_data = json_decode($request,true);
if(isset($request_data['EmailAddress']) && isset($request_data['Password'])){
if($request_data['EmailAddress']){
$obj = new FosterGemUser();
$user_data = $obj->get_user($request_data['EmailAddress'],$request_data['Password'],$request);
} else {
$error='Please enter your email address.';
}
} else {
$error='Wrong Data Format.';
}
} catch (Exception $ex) {
$error=$ex->getMessage();
log_error($error,"index.php | login function");
}
if($error) {
$return_data= '{"Status":"Error","Message":"'.$error.'"}';
} else {
$return_data=$user_data;
}
echo $return_data;
}
Nun sowohl die api funktioniert gut, wenn ich es nennen, die Verwendung von Rest-client. Allerdings, wenn ich call-login-api von javascript funktioniert es auch, aber messagebhej-api gibt Fehler
XMLHttpRequest cannot load http://api.fostergem.com/messagebhej/556714b04ec0a40d3cda0118/{app_auth_token}. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:63343' is therefore not allowed access. The response had HTTP status code 404.
Ich bin verrückt. Alles, was ist, ist dieselbe dann, wie die cors aktiviert ist für eine api und nicht für andere.
Hier ist meine cors_enable.php
<?php
//Specify domains from which requests are allowed
header('Access-Control-Allow-Origin: *');
//Specify which request methods are allowed
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
//Additional headers which may be sent along with the CORS request
//The X-Requested-With header allows jQuery requests to go through
header('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');
//Set the age to 1 day to improve speed/caching.
header('Access-Control-Max-Age: 86400');
?>
- Warum jemand downvoted die Antwort. Wird es nicht besser, den Grund zu erklären für downvoting?
- Welche server benutzt du? Apache?
- Ja ich benutze apache
- Sagen Sie mir, wenn dieser die Ihnen helfen könnte.
- haben Sie gefunden, die Lösung noch. Ich habe das gleiche problem, aber noch nicht wissen, wie Sie zu beheben ist :(((
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keinen Punkt der Nachbereitung header-Anweisungen aktivieren CORS in der API mit den Bedingungen, die Sie haben.
Recht jetzt würde nur Kopfzeilen, wenn der REQUEST_METHOD ist OPTIONEN und HTTP_ACCESS_CONTROL_REQUEST_METHOD ist entweder GET oder POST, aber Ihrem Wunsch nicht entsprechen diesem.
So ersetzen
den code mit
PS:, es sei denn, Sie haben eine server-variable setzen wie HTTP_ACCESS_CONTROL_REQUEST_METHOD, es zu ändern REQUEST_METHOD
Für Slim Framework Version 2.4 ich habe einen kleinen hack zur Bewältigung der Preflight-OPTIONS-Anfrage
So wird diese Spur alle OPTIONEN Anfragen und true zurückgeben, und es funktionierte für mich.
Meine .htaccess-Datei wurde wie folgt
Hoffe, das hilft.
Ich landete dieses einfache middleware-Klasse:
Benutze ich es so (es ist ein string, weil der dependency injection):
$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']
sieht falsch aus. Dass eine gültige _SERVER variable? Meinst du einfachREQUEST_METHOD
?Ist die ORIGIN-header in der Tat eigentlich gesendet? Vertrauen die Fehlermeldung.
Können Sie so etwas wie WireShark oder zumindest Schritt für Schritt durch den code irgendwie? Auch echo/log Aufrufe, um sicherzustellen, dass Ihre Logik ist wie erwartet.
Ich hatte das gleiche problem, aber am Ende erreichte ich, um es arbeiten
Ich bin mit cors-middleware https://github.com/tuupola/cors-middleware
Dies sind meine Einstellungen:
Achten Sie auf die
headers.allow
- Taste. Wenn Sie versuchen, mit"*"
wird es scheitern. Sie müssen auflisten, die mindestens diese zwei Header als erlaubt.Ich hatte das gleiche Problem während der Arbeit an einem ionic hybrid mobile Anwendung. Ich habe den folgenden code unter meinen index.php Datei.
Folgen Sie den Anweisungen auf der faulen CORS in den folgenden link...das funktionierte für mich...
um genau zu sein, machte ich einen cors.php Datei serperate die Routen, die Sie behandeln, für Kerne und einfügen den code in der Datei.
http://www.slimframework.com/docs/v3/cookbook/enable-cors.html
UPDATE
Da Stand ich dieses problem von meinem internen server, wo ich hatte zwei web-Server laufen für meine back-end-API, und die andere auf Winkel-CLI die Lösung ist in diesem Kontext.
CORS funktioniert durch die überprüfung, ob die request-url gültig ist und senden Sie eine preflight-Anfrage mit OPTIONEN Methode, das problem ist, dass Ihr restful API router ist nicht konfiguriert, um die Anfrage so gibt es eine NOT_FOUND Antwort. Also, was Sie tun ist, fügen Sie das routing für alle OPTIONEN-Anforderungen, wie eine einfache Lösung, aber Sie kann genauer sein.
Schön und tidey, erstellen Sie eine cors.php Datei, wo Sie die Routen für Ihre cors Routen und fügen Sie diesen code in es
Im Grunde, was dies sagt, ist, für alle Optionen-Anforderungen auf allen Strecken, nur eine Antwort zurück, ohne Behandlung. Was ist wichtig hier ist die middleware, die ausführt, dass nach der Rücksendung der Antwort wird die Antwort-Header, wird Ihrem Webbrowser mitzuteilen, dass es OK ist, senden Sie die eigentliche Anfrage.
Hinweis: Stellen Sie sicher, dass die cors.php Datei fällt, als der Letzte Satz von Routen. Auch nicht, setzen Sie einen Stern als Ihre Domäne Herkunft, funktioniert es ebenfalls nicht.