Kodėl OPTIONS užklausa išsiųsta ir ar galiu ją išjungti?

Aš kuriu žiniatinklio API. Radau, kad kai naudoju „Chrome“ POST, GET mano API, visada yra OPTIONS užklausa, siunčiama prieš tikrą prašymą, o tai yra gana erzina. Šiuo metu gaunu serverį ignoruoti bet kokius OPTIONS prašymus. Dabar mano klausimai yra tokie: kas gera siųsti OPTIONS užklausą dvigubinti serverio apkrovą? Ar galima visiškai neleisti naršyklei siųsti OPTIONS užklausų?

266
29 апр. Elgs Qian Chen nustatytas balandžio 29 d 2015-04-29 23:37 '15, 23:37 pm 2015-04-29 23:37
@ 15 atsakymų

redaguoti 2018-09-13 : pridėjote šiek tiek paaiškinimų dėl šio prašymo prieš skrydį ir kaip išvengti šio atsakymo pabaigoje.

OPTIONS užklausos yra tai, ką mes vadiname prašymais dėl pre-flight prieš Cross-origin resource sharing (CORS) .

Jie yra būtini, kai tam tikrose situacijose atliekate užklausas iš įvairių šaltinių.

Kai kurie naršyklės prašymai atlikti šį patikrinimą yra saugumo priemonė, užtikrinanti, kad vykdomas prašymas būtų patikimas serveris. Tai reiškia, kad serveris supranta, kad metodas, šaltinis ir antraštės, siunčiamos pagal pareikalavimą, yra saugūs.

Jūsų serveris neturėtų ignoruoti, bet apdoroti šiuos prašymus, kai bandote vykdyti užklausas iš įvairių šaltinių.

Gerą šaltinį galima rasti čia http://enable-cors.org/

Norėdami išspręsti šią problemą, įsitikinkite, kad bet kuriam OPTIONS metodo maršrutui serveris siunčia atsakymą su šia antrašte

Access-Control-Allow-Origin: *

Tai parodys naršyklei, kad serveris yra pasirengęs reaguoti į bet kokios kilmės užklausas.

Daugiau informacijos apie tai, kaip pridėti CORS palaikymą jūsų serveriui, žr. Toliau pateiktoje schemoje.

http://www.html5rocks.com/static/images/cors_server_flowchart.png

2019

244
29 апр. Leo Correa atsakymas balandžio 29 d 2015-04-29 23:53 '15, 23:53, 2015-04-29 23:53

Prašome atsakyti į šį atsakymą dėl faktinio išankstinio apmokėjimo pasirinkimo poreikio: CORS - Kokia yra motyvacija įvesti prieš skrydžio prašymus?

Jei norite išjungti „OPTIONS“ užklausą, turi būti įvykdytos šios sąlygos:

  • Prašymas nenustato priskirtų HTTP antraštių, pvz., „Application / xml“ arba „application / json“ ir tt
  • Prašymo metodas turi būti vienas iš GET, HEAD arba POST. Jei POST, turinio tipas turi būti vienas iš application/x-www-form-urlencoded , kelių multipart/form-data arba text/plain

Nuoroda: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

129
18 мая '15 в 9:08 2015-05-18 09:08 atsakymas pateikiamas prietaiso_exec gegužės 18 d., 15 val. 9:08 2015-05-18 09:08

Gone ši problema, žemiau yra mano išvada dėl šios problemos ir mano sprendimo.

Pagal CORS strategiją (aš primygtinai rekomenduoju perskaityti apie tai). Jūs negalite tiesiog priversti naršyklę sustabdyti OPTION užklausos siuntimą, jei jis mano, kad tai būtina.

Čia jūs galite apsieiti dviem būdais.

    • Įsitikinkite, kad jūsų prašymas yra „paprastas prašymas“.
    1. Nustatykite „ Access-Control-Max-Age OPTION užklausai

Paprasta užklausa

Paprastas prašymas pateikti svetainę yra toks, kuris atitinka visas šias sąlygas:

Leidžiami tik tokie metodai: - GET - Chapter - POST

Be antraštės, kurias automatiškai nustato vartotojo agentas (pvz., Ryšys, vartotojo agentas ir kt.), Vienintelės antraštės, kurias galite įdiegti rankiniu būdu, yra šios: - Priimti - Priimti kalbą - Turinio kalba - Turinio tipas

Vienintelės turinio tipo antraštės reikšmės yra šios: - taikymas / x-www-form-urlencoded - kelių dalių / formų duomenys - tekstas / paprastas

Paprastas prašymas nesukels preflight OPTION užklausos.

Nustatykite talpyklą, kad patikrintumėte OPTION

Galite nustatyti „ Access-Control-Max-Age OPTION užklausai, kad jis nepasitikrintų leidimo dar iki jo galiojimo pabaigos.

„Access-Control-Max-Age“ suteikia vertę sekundėmis, kiek laiko atsakymas į išankstinio patikrinimo užklausą gali būti išsaugotas nepateikiant kito prašymo prieš skrydį.

128
02 нояб. Atsakymą pateikė Neekey 02 lapkričio. 2016-11-02 09:48 '16 at 9:48 2016-11-02 09:48

Atidarę derinimo konsolę ir įjungus parinktį Disable Cache , visada bus siunčiami išankstinio patikrinimo prašymai (ty prieš kiekvieną užklausą) .Jei neatšaukiate talpyklos, prašymas prieš skrydį bus išsiųstas tik vieną kartą (serveryje)

38
24 февр. Atsakymas pateikiamas Nir 24 vasario mėn. 2016-02-24 00:28 '16 at 0:28 2016-02-24 00:28

Taip, galite išvengti užklausų. Pasirinkimo parinktis yra išankstinis pardavimas, kai siunčiami (siunčiami) duomenys į kitą domeną. Tai naršyklės saugumo problema. Bet mes galime naudoti kitą technologiją: transporto lygį iframe. Aš primygtinai rekomenduoju pamiršti bet kokią CORS konfigūraciją ir naudoti raktinį sprendimą, ir jis veiks visur.

Pažvelkite čia: https://github.com/jpillora/xdomain

Ir darbo pavyzdys: http://jpillora.com/xdomain/

Pasimylėkite dieną!

38
18 мая '15 в 7:30 2015-05-18 07:30 atsakymą pateikė vartotojo889349 gegužės 18 d., 15 val

Kaip minėta ankstesniuose pranešimuose, OPTIONS užklausos egzistuoja dėl tam tikrų priežasčių. Jei turite problemų, susijusių su dideliu atsako laiku iš jūsų serverio (pvz., Užjūrio ryšiu), taip pat galite naudoti naršyklės talpyklą prašymams prieš skrydį.

Atsakykite į serverį su „ Access-Control-Max-Age antrašte, o užklausoms, siunčiamoms tuo pačiu parametru, išankstinio patikrinimo užklausa bus išsaugota talpykloje ir nebus dar kartą.

14
22 февр. Atsakymas pateikiamas enpenax 22 vasaris. 2016-02-22 06:02 '16 at 6:02 am 2016-02-22 06:02

Kūrėjui, kuris supranta priežastį, kodėl jis egzistuoja, bet jis turi gauti prieigą prie API, kuri nesikreipia į OPTIONS skambučius be leidimo, man reikia laikino atsakymo, kad galėčiau vystytis vietiniu mastu, kol API savininkas pridės tinkamą paramą SPA CORS ar I Aš negausiu tarpinio serverio API.

Radau, kad galite išjungti „CORS“ „Safari“ ir „Chrome“ „Mac“.

„Chrome“ išjungti tą pačią kilmės politiką

„Chrome“: uždarykite „Chrome“, atidarykite terminalą ir įklijuokite šią komandą: open /Applications/Google\ Chrome.app --args --disable-web-security --user-data-dir

„Safari“: išjungti tos pačios kilmės politiką „Safari“

Jei norite išjungti tos pačios kilmės politiką „Safari“ (turiu 9.1.1), jums reikia tik įjungti kūrėjo meniu ir pasirinkite „Išjungti kryžminio kilmės apribojimus“ kūrimo meniu.

12
10 марта '17 в 21:27 2017-03-10 21:27 Atsakymą davė Juozapas Juhnke kovo 17 d. 17 val. 21:27 2017-03-10 21:27

Aš išsprendžiau šią problemą kaip.

 if($_SERVER['REQUEST_METHOD'] == 'OPTIONS'  ENV == 'devel') { header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Headers: X-Requested-With'); header("HTTP/1.1 200 OK"); die(); } 

Tai tik vystymuisi. Tuo pačiu metu laukiu 9 ms ir 500 ms, o ne 8 ir 500 ms. Tai galiu padaryti, nes JS gamybos programa bus naudojama toje pačioje mašinoje, kaip ir gamyba, todėl OPTIONS nebus, tačiau plėtra yra mano vietinė.

6
02 марта '16 в 19:06 2016-03-02 19:06 atsakymą pateikė „ AntiCZ“ kovo 16 d . 16:06 2016-03-02 19:06

Jūs negalite, bet galite vengti naudoti CORS su JSONP.

5
16 мая '15 в 19:32 2015-05-16 19:32 atsakymą davė Jose Mato gegužės 16 d. 15 val. 19:32 2015-05-16 19:32

Išleidęs visą dieną ir pusę bandydamas susidoroti su panašiomis problemomis, sužinojau, kad jis buvo susijęs su IIS .

Web API projektas buvo sukonfigūruotas taip:

 $.ajax({ url: "http://crossdomainurl", type: "POST", contentType: 'text/plain' }); 
-1
18 марта '18 в 20:28 2018-03-18 20:28 atsakymą Bala pateikė 18 kovo 18 d. 20:28 2018-03-18 20:28

Galbūt yra sprendimas (bet aš to nepadariau): galite naudoti CSP (turinio saugumo politiką), kad įgalintumėte nuotolinį domeną ir naršykles, galite praleisti CORS OPTIONS užklausos tikrinimą.

Aš, jei radsiu šiek tiek laiko, jį patikrinsiu ir atnaujinsiu!

CSP: https://developer.mozilla.org/fr/docs/Web/HTTP/Headers/Content-Security-Policy

CSP specifikacija: https://www.w3.org/TR/CSP/

-1
26 июля '18 в 13:00 2018-07-26 13:00 „ Arnaud Tournier“ atsakymas pateikiamas liepos 26 d. 18 val. 13.00 val

Ką man teko importuoti „github.com/gorilla/handlers“ ir tada naudoti jį taip:

 router := mux.NewRouter() router.HandleFunc("/config", getConfig).Methods("GET") router.HandleFunc("/config/emcServer", createEmcServers).Methods("POST") headersOk := handlers.AllowedHeaders([]string{"X-Requested-With", "Content-Type"}) originsOk := handlers.AllowedOrigins([]string{"*"}) methodsOk := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "OPTIONS"}) log.Fatal(http.ListenAndServe(":" + webServicePort, handlers.CORS(originsOk, headersOk, methodsOk)(router))) 

Kai tik įvykdavau POJ Ajax prašymą ir susijusius JSON duomenis, „Chrome“ visada pridės turinio tipo antraštę, kuri nebuvo mano ankstesnėje „AllowedHeaders“ konfigūracijoje.

-1
17 мая '17 в 18:52 2017-05-17 18:52 Atsakymą pateikė Kurtas gegužės 17 d. 17 val. 18:52

Vienas iš anksčiau naudojamų sprendimų yra pasakyti, kad jūsų svetainė yra „mydomain.com“, ir jums reikia pateikti „timex“ užklausą dėl užsienio domeno.

Nustatykite IIS korespondenciją iš savo domeno į kitą domeną.

 <rewrite> <rules> <rule name="ForeignRewrite" stopProcessing="true"> <match url="^api/v1/(.*)$" /> <action type="Rewrite" url="https://foreigndomain.com/{R:1}" /> </rule> </rules> </rewrite> 

jūsų svetainėje mydomain.com - galite pateikti tą patį šaltinio užklausą ir nereikia jokių užklausų dėl parinkčių :)

-2
30 окт. David McEleney atsakymas spalio 30 d 2017-10-30 04:38 '17 at 4:38 2017-10-30 04:38

Jis gali būti įjungtas, jei naudojamas proxy serveris, kuris perima užklausą ir rašo atitinkamas antraštes. Konkrečiu lako atveju tai būtų taisyklės:

 if (req.http.host == "CUSTOM_URL" ) { set resp.http.Access-Control-Allow-Origin = "*"; if (req.method == "OPTIONS") { set resp.http.Access-Control-Max-Age = "1728000"; set resp.http.Access-Control-Allow-Methods = "GET, POST, PUT, DELETE, PATCH, OPTIONS"; set resp.http.Access-Control-Allow-Headers = "Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,Keep-Alive,X-Requested-With,If-Modified-Since"; set resp.http.Content-Length = "0"; set resp.http.Content-Type = "text/plain charset=UTF-8"; set resp.status = 204; } 

}

-2
31 янв. atsakymą pateikė Rafa Cuestas 2018-01-31 17:23 '18, 18:23 PM 2018-01-31 17:23

Kiti klausimai apie „ žymes arba Užduoti klausimą