Водичи

Како да ги поправите CORS грешките (и зошто се јавуваат)

CORS грешка значи дека вашата веб-страница се обидела да прочита одговор од друг origin (друг домен, порта или протокол), а тој сервер не испратил заглавија што велат дека е дозволено. Прелистувачите го блокираат одговорот за да ги заштитат корисниците. Поправката е на серверот: вратете заглавие Access-Control-Allow-Origin за origin-от на вашиот сајт и ракувајте со OPTIONS preflight барања, или ја избегнувате така што барањето ќе го испраќате преку сопствен бекенд на ист origin.

Тоа е една од најзбунувачките грешки во веб-развојот, бидејќи барањето често стигнува до серверот без проблем. Овој водич објаснува што се случува и како да се поправи секоја варијанта.

Што значи „origin“

Origin е комбинација од протокол, домен и порта:

URLOrigin
https://myapp.com/dashboardhttps://myapp.com
https://api.myapp.com/usershttps://api.myapp.com (друга поддомена, па друг origin)
http://localhost:5173http://localhost:5173
http://localhost:3000http://localhost:3000 (друга порта, па друг origin)

Прелистувачите ја следат same-origin политиката: JavaScript на страницата слободно може да чита одговори од сопствениот origin, но не и од други. CORS (Cross-Origin Resource Sharing) е системот со кој серверот се согласува: „одговорите од мене може да ги читаат страници од овие origin-и.“

Две последици изненадуваат луѓе:

  • Барањето често стигнува до серверот. CORS обично го блокира вашиот код да го чита одговорот, а не серверот да го прими барањето. POST може да е зачувано, иако сте видели грешка.
  • Само прелистувачите го спроведуваат. curl, Postman и серверскиот код го игнорираат CORS целосно. Затоа „работи во Postman“ ништо не ви кажува за CORS.

Чекор 1: Прочитајте ја точната грешка

Отворете ги алатките за програмери (десен клик → Inspect / Прегледај), одете на Console / Конзола и прочитајте ја целата порака. Формулацијата во Chrome ви кажува кој проблем имате:

Пораката содржиШто не е во ред
No 'Access-Control-Allow-Origin' header is presentСерверот воопшто не го испратил заглавието, или барањето паднало пред да стигне до вашиот CORS код (на пример 404 или 500)
The 'Access-Control-Allow-Origin' header has a value '...' that is not equal to the supplied originСерверот дозволува различен origin од вашиот
Response to preflight request doesn't pass access control checkOPTIONS preflight-от не успеа
...must not be the wildcard '*' when the request's credentials mode is 'include'Испраќате колачиња, а серверот одговорил со *
Request header field authorization is not allowedСерверот не го наведол тоа заглавие во Access-Control-Allow-Headers

Потоа отворете го табот Network / Мрежа, најдете го неуспешното барање (и секое OPTIONS барање пред него) и погледнете го статус кодот и заглавијата на одговорот.

Прво проверете го статус кодот. Многу „CORS грешки“ всушност се серверска грешка во маска. Ако серверот падне или врати 404, неговиот одговор со грешка често нема CORS заглавија, па прелистувачот пријавува CORS наместо вистинскиот проблем. Поправете ја грешката 500 или 404, и CORS грешката можеби исчезнува.

Чекор 2: Одлучете дали воопшто треба да се повикува тој API од прелистувачот

Пред да додавате заглавија, прашајте: треба ли прелистувачот да го повикува овој API директно?

  • API од трета страна што бара тајен клуч (OpenAI, Stripe secret key, повеќето услуги за е-пошта) никогаш не треба да се повикува од прелистувачот. Клучот би бил видлив за секој посетител. Повикајте го од вашиот бекенд, и CORS проблемот исчезнува, бидејќи барањата од сервер до сервер не се предмет на CORS. Видете како да ги чувате API клучевите безбедни.
  • API од трета страна што не го контролирате и не испраќа CORS заглавија не може да се поправи од ваша страна. Повикајте го од вашиот бекенд.
  • Вашиот API може да се поправи со правилно конфигурирање. Продолжете подолу.

Чекор 3: Поправете го на вашиот сервер

Серверот мора да ги додава вистинските заглавија на своите одговори, вклучително и одговорите со грешки.

За самото барање испратете:

  • Access-Control-Allow-Origin: https://myapp.com (точниот origin на вашиот фронтенд, без коса црта на крајот)
  • Vary: Origin, ако вредноста зависи од тоа кој origin прашал

За preflight OPTIONS барањето одговорете со успешен статус (200 или 204) и:

  • Access-Control-Allow-Origin: https://myapp.com
  • Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE
  • Access-Control-Allow-Headers: Content-Type, Authorization (секое прилагодено заглавие што го испраќате)
  • По избор Access-Control-Max-Age: 600, за прелистувачот да го кешира preflight-от подолго

Повеќето фрејмворци имаат пакет или поставка што го прави ова. Во Express, пакетот cors; во FastAPI, CORSMiddleware; во ASP.NET Core, AddCors; во Spring, @CrossOrigin или CORS конфигурација. Типично поставување во Express:

import cors from "cors";

app.use(cors({
  origin: ["https://myapp.com", "http://localhost:5173"],
  credentials: true,
}));

CORS ракувањето ставете пред вашите рути и автентикација, за preflight барањата (кои не носат најава) да не бидат одбиени со 401.

Со AI градител опишете ја поставката прецизно:

Фронтенд-от на https://myapp.com го повикува API-то на https://api.myapp.com и добива „Response to preflight request doesn't pass access control check“. Конфигурирај CORS на API-то така што ќе дозволува точно https://myapp.com и origin-от на прегледот, да дозволува GET, POST, PATCH, DELETE со заглавијата Content-Type и Authorization, да ракува со OPTIONS пред автентикацијата, и да вклучи CORS заглавија и на одговорите со грешки.

Чекор 4: Ракувајте со колачиња и credentials

Ако вашиот фронтенд испраќа колачиња (на пример сесија за најава) до друг origin, двете страни мора да се согласат:

  • Фронтенд-от поставува credentials: "include" на fetch, или withCredentials: true во axios.
  • Серверот испраќа Access-Control-Allow-Credentials: true.
  • Access-Control-Allow-Origin на серверот мора да биде точниот origin, а не *.

Меѓусајтовските колачиња исто така треба SameSite=None; Secure, а некои прелистувачи дополнително ги ограничуваат колачињата од трети страни. Тоа е уште една причина да го претпочитате пристапот од Чекор 5.

Чекор 5: Избегнете CORS со поставка на ист origin

Често најчистата поправка е да не правите меѓусајтовски барања воопшто. Послужете го API-то од истиот origin како страницата, на пример на https://myapp.com/api/...:

  • Во развој, повеќето развојни сервери можат да прокси. Поставката server.proxy во Vite може да го препрати /api кон вашиот бекенд на друга порта, па прелистувачот секогаш комуницира само со еден origin.
  • Во продукција, рутирајте го /api кон бекендот преку rewrite или proxy поставките на вашиот хост, или послужете го фронтендот и API-то од еден сервер.

Фронтендот тогаш повикува релативна патека како fetch("/api/orders"). Нема меѓусајтовско барање, нема preflight меѓу origin-и и нема проблеми со колачиња. Исто така, не ја кодирате API доменот што се разликува помеѓу прегледот и продукцијата.

Промени го фронтендот да го повикува бекендот со релативни /api патеки наместо целосен URL, и постави развоен прокси така што /api ќе се препраќа кон API серверот. Потоа отстрани ги CORS поставките што веќе не ни требаат.

Што да не правите

  • mode: "no-cors" во fetch. Ништо не заобиколува; му дава на вашиот код празен, нечитлив одговор.
  • Додатоци за прелистувач што го исклучуваат CORS. Тие ја менуваат само вашата прелистувач. Секој посетител сè уште ја гледа грешката.
  • Јавни „CORS прокси“ услуги за вистински апликации. Можат да читаат и менуваат сè што минува низ нив, а и се расипуваат.
  • Access-Control-Allow-Origin: * на API што користи најава. И онака не функционира со credentials, а е погрешен почетен избор за приватни податоци.
  • Враќање на секој Origin заглавие назад со дозволени credentials. Тоа му овозможува на секоја веб-страница да прави барања со најава во име на вашите корисници. Користете список на дозволени.

Чести причини во апликации изградени со AI

СитуацијаПоправка
Фронтендот повикува API од трета страна со тајан клучПреместете го повикот на бекендот
Работи во прегледот, не работи на објавениот доменДодајте ги објавениот и прилагодениот домен во список на дозволени, или користете релативни /api патеки
Грешката е само кај POST, PUT или DELETEPreflight не е ракуван; додајте ракување за OPTIONS и дозволени заглавија
Грешката се појавила откако додадовте најаваCredentials бараат точен origin и Allow-Credentials
„CORS грешка“, но табот Network покажува 500Прво поправете ја серверската грешка
URL на API-то е тврдо кодиран на localhostКористете релативни патеки или поставка по околина

CORS во Mythex

Кога проектот во Mythex има веб-сајт и API сервер, и двете работат како услуги во истиот проект, а можете да се префрлате меѓу нив во прегледот. Ако му кажете на агентот фронтендот да го повикува бекендот преку релативна /api патека, проксирана во развој, избегнувате повеќето CORS проблеми. Ако навистина ви требаат меѓусајтовски повици, дајте му на агентот точната грешка од конзолата и вклучените origin-и. Проверете го резултатот и на објавената апликација, бидејќи нејзината адреса се разликува од прегледот. Видете Повеќе-сервисни апликации и API бекенди во документацијата, и нашите водичи за дебагирање на апликација изградена со AI и фронтенд наспроти бекенд.

Контролна листа за CORS

  • Прочитана целата грешка од конзолата и статус кодот на неуспешното барање
  • Исклучена скриена 404 или 500 грешка
  • API-ја со тајни клучеви се повикуваат од бекендот, не од прелистувачот
  • Серверот испраќа Access-Control-Allow-Origin со точни дозволени origin-и
  • OPTIONS preflight-от е одговорен со дозволени методи и заглавија, пред автентикацијата
  • CORS заглавијата се присутни и на одговорите со грешки
  • Credentials: точен origin, Allow-Credentials: true и точни поставки за колачиња
  • Опфатени се прегледот, објавениот и прилагодениот домен, или се користат релативни /api патеки
  • Нема no-cors, јавни проксија или враќање на секој origin

Прашања

Што значи CORS грешка?

Вашата страница, вчитана од еден origin, се обидела да прочита одговор од друг origin, а серверот на тој одговор немал заглавија што го дозволуваат тоа. Прелистувачот го блокира вашиот код да го чита одговорот. Поправката е на серверот или во начинот на рутирање на барањето, не во фронтенд кодот.

Може ли да поправам CORS грешка од фронтенд?

Не правилно. Поставки како mode: 'no-cors' само го скриваат одговорот од вашиот код. Поправате така што серверот ќе го испрати точното заглавие Access-Control-Allow-Origin, или така што API-то ќе го повикате од сопствен бекенд или прокси на ист origin.

Дали е безбедно Access-Control-Allow-Origin: *?

Во ред е за јавни податоци што секој може да ги чита, како јавен API без најава. Не може да се користи со колачиња или други credentials, а за приватни API треба да ги наведете точните дозволени origin-и.

Зошто барањето работи во Postman или curl, но не во прелистувачот?

CORS го спроведуваат само прелистувачите. Алатки како Postman и curl не го применуваат, па барањето може да успее таму и сепак да биде блокирано кога JavaScript на страницата го испраќа.

Што е preflight барање?

За барања што не се едноставни, како JSON POST или барање со заглавие Authorization, прелистувачот прво испраќа OPTIONS барање со прашање кои методи и заглавија се дозволени. Ако тоа OPTIONS барање не успее или нема соодветни заглавија, вистинското барање никогаш не се испраќа.

Mythex · Pricing · Градете што било со AI · Шаблони за веб-страници и апликации · Mythex во споредба · Речник за градење апликации со AI · Бесплатни алатки за градење апликации со AI · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)