Lumen: Aktivieren CORS
Baute ich eine API mit Lumen und möchten Zugriff mit JavaScript und dem XMLHttpRequest-Objekt. Aber jedes mal, wenn mein PUT -, GET -, POST-und DELETE-Anfragen transformiert werden in OPTIONEN - Anfrage. Ich Las eine Menge von websites, die Informationen von CORS. Ich Baue middleware mit folgendem Inhalt:
class CORSMiddleware
{
public function handle($request, \Closure $next)
{
$response = null;
/* Preflight handle */
if ($request->isMethod('OPTIONS')) {
$response = new Response();
} else {
$response = $next($request);
}
$response->header('Access-Control-Allow-Methods', 'OPTIONS, HEAD, GET, POST, PUT, DELETE');
$response->header('Access-Control-Allow-Headers', $request->header('Access-Control-Request-Headers'));
$response->header('Access-Control-Allow-Origin', '*');
return $response;
}
}
My client code:
var url = "http://localhost:8000/api/user";
var xmlHttpRequest = new XMLHttpRequest();
xmlHttpRequest.open('PUT', url, false);
xmlHttpRequest.send('{"username": "ABC", "password": "ABC","email": "[email protected]" }');
if (xmlHttpRequest.status == 200) {
console.log(xmlHttpRequest.responseText);
}
Meine Anfrage-Informationen von GET-Anforderung:
Host: localhost:8000
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Origin: null
Connection: keep-alive
Cache-Control: max-age=0
Meine Antwort-Informationen, die von einer GET-Anforderung:
Access-Control-Allow-Methods: OPTIONS, HEAD, GET, POST, PUT, DELETE
Access-Control-Allow-Origin: *
Cache-Control: no-cache
Connection: close
Content-Type: text/html; charset=UTF-8
Date: Sun, 27 Dec 2015 10:36:51 GMT
Host: localhost:8000
x-powered-by: PHP/7.0.0
Meine Anfrage-Informationen von einer PUT-Anfrage:
Host: localhost:8000
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Access-Control-Request-Method: PUT
Origin: null
Connection: keep-alive
Cache-Control: max-age=0
Meine Antwort von einer PUT-Anfrage:
Cache-Control: no-cache
Connection: close
Content-Type: text/html; charset=UTF-8
Date: Sun, 27 Dec 2015 10:36:51 GMT
Host: localhost:8000
x-powered-by: PHP/7.0.0
In der preflight-es gibt keine "Access-Control-Allow-*"-Header. Ich weiß nicht, warum; ich konnte es mit meinem lumen-cors-middleware.
- Es klingt wie Ihre Anforderung ist die Auslösung der browser zu senden Sie zuerst a CORS preflight. Es gibt keine Möglichkeit zu umgehen, dass; es ist erforderlich, das Verhalten im Browser mit Hinblick auf cross-origin-requests. So wie es scheint, müssen Sie möglicherweise zu Lesen, auf die CORS-docs und aktualisieren Sie Ihren code entsprechend.
- Auf
PUT
AJAX-Anfragen und in vielen anderen Fällen-Browser erzeugen, Preflight requests, die Sie versucht haben, zu behandeln. Was ist deine genaue Frage? - Keine POST -, PUT-oder DELETE-Anforderung funktioniert - keine Antwort, das ist mein Problem 🙂 GET-Anforderungen arbeiten
- Ich schon fangen die preflight mit den angegebenen php-code..aber Sie funktionieren nicht, warum?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fügen folgenden Header in der öffentlichkeit/.htaccess-Datei.
dies ist in Ordnung für Sie zu beheben Cross-Origin-Problem.
In
Lumen
, müssen Sie setupOPTIONS
Routen manuell für jedePOST, PUT, DELETE...
Routen.Dies ist, was ich getan habe um das problem zu beheben.
Die route oben fangen alle
OPTIONS
Anfragen für Sie.In
cors.options
middleware: