Próbuję wysłać żądanie HTTP między domenami do usługi WCF (której jestem właścicielem). Przeczytałem kilka technik pracy z ograniczeniami skryptów międzydomenowych. Ponieważ moja usługa musi obsługiwać zarówno żądania GET, jak i POST, nie mogę zaimplementować jakiegoś dynamicznego tagu skryptu, którego src jest adresem URL żądania GET. Ponieważ mogę wprowadzać zmiany na serwerze, zacząłem próbować zastosować obejście polegające na skonfigurowaniu odpowiedzi serwera tak, aby zawierały nagłówek „Access-Control-Allow-Origin” i żądania „preflight” z żądaniem i OPTIONS. Pomysł zaczerpnąłem z tego postu: Jak działa CORS
Po stronie serwera moją metodą internetową jest dodanie „Access-Control-Allow-Origin: *” do odpowiedzi HTTP. Widzę, że odpowiedzi zawierają teraz ten nagłówek. Moje pytanie brzmi: Jak mogę „sprawdzić” wniosek (OPCJE)? Używam jQuery.getJSON, aby wykonać żądanie GET, ale przeglądarka anuluje żądanie od razu z niesławnym:
Origin http: // localhost nie jest dozwolony przez Access-Control-Allow-Origin
Czy ktoś zna tę technikę CORS? Jakie zmiany należy wprowadzić po stronie klienta, aby wstępnie przesłać moje żądanie?
Dzięki!
źródło
Access-Control-Allow-Origin: *
//cors and preflight filtering app.all('*', function(req, res, next){.. //preflight needs to return exact request-header res.set('Access-Control-Allow-Headers', req.headers['access-control-request-headers']); if ('OPTIONS' == req.method) return res.send(204);next(); });
Chociaż ten wątek sięga 2014 roku, dla wielu z nas problem nadal może być aktualny. Oto jak sobie z tym poradziłem w kontekście jQuery 1.12 / PHP 5.6:
Przykład kodu PHP:
if (!empty($_SERVER['HTTP_ORIGIN'])) { // Uh oh, this XHR comes from outer space... // Use this opportunity to filter out referers that shouldn't be allowed to see this request if (!preg_match('@\.partner\.domain\.net$@')) die("End of the road if you're not my business partner."); // otherwise oblige header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN']); } else { // local request, no need to send a specific header for CORS }
W szczególności nie należy dodawać,
exit;
ponieważ inspekcja wstępna nie jest potrzebna.źródło