Кратак одговор
CORS грешка настаје када прегледач блокира захтев ка другом домену јер server није послао одговарајуће `Access-Control-Allow-Origin` заглавље. Решење је на серверу: додајте дозвољени оригин, методе и заглавља, или користите proxy током развоја. Не покушавајте да је заобиђете на фронтенд-у.
Како се проблем препознаје
- У конзоли прегледача пише: "Access то фетцх ат ... хас been блоцкед by CORS policy"
- API позив ради у Постман-у или цурл-у, али не у прегледачу
- Мрежни захтев има статус 0 или (фаилед) у картици Network
- Појављује се само на локалном развојном серверу, не у продукцији
- Грешка се јавља након додавања новог домена или poddomena
Најчешћи узроци
Недостаје Access-Control-Allow-Origin
Server не шаље заглавље `Access-Control-Allow-Origin` или шаље вредност која се не поклапа са оригин-ом странице. Прегледач тада блокира читање одговора.
Погрешан оригин или wildcard са креденцијалима
Ако користите `credentials: 'include'`, server не сме да врати `*` већ тачан оригин. Такође, `http://localhost:3000` и `http://127.0.0.1:3000` су различити оригин-и.
Префлигхт захтев није обрађен
За нестандардне методе или заглавља прегледач прво шаље OPTIONS захтев. Ако server не одговори на OPTIONS са одговарајућим заглављима, главни захтев се не шаље.
Proxy или хостинг не прослеђује заглавља
Реверсе proxy (Nginx, Apache) или serverless платформа могу уклонити CORS заглавља или вратити сопствену страницу грешке. Проверите конфигурацију proxy-ja.
Погрешан URL API-ја
Ако фронтенд позива погрешан домен, poddomen или порт, server можда не дозвољава тај оригин. Проверите тачан URL у коду и листу дозвољених оригин-а на серверу.
Решење корак по корак
- 1
Проверите тачан оригин у прегледачу
Отворите DevTools (Ф12) и у конзоли укуцајте
location.origin. Запишите тачну вредност, на примерhttp://localhost:3000. У картици Network пронађите неуспешан захтев и погледајте заглавља захтева и одговора. Обратите пажњу наOriginу захтеву иAccess-Control-Allow-Originу одговору. - 2
Подесите CORS на серверу
На бацкенд-у експлицитно дозволите оригин фронтенд-а. У Node.js/Express:
app.use(cors({ origin: 'http://localhost:3000', credentials: true })). У Спринг Boot:@CrossOrigin(origins = "http://localhost:3000")или глобална конфигурација. У АСП.НЕТ Core:builder.Services.AddCors(...)иapp.UseCors(...). Увек наводите тачан оригин, не*, ако користите креденцијале. - 3
Обрадите OPTIONS префлигхт
Проверите да ли server враћа 204 или 200 на OPTIONS захтев са заглављима
Access-Control-Allow-MethodsиAccess-Control-Allow-Headers. У Express-u то радиcorsmiddleware аутоматски. У Nginx-u додајтеadd_header Access-Control-Allow-Origin ...иif ($request_method = OPTIONS) { return 204; }. - 4
Користите proxy током локалног развоја
Ако не можете да мењате server, подесите proxy у развојном алату. У Вите:
server.proxyуvite.config.js. У Цреате React App:proxyпоље уpackage.json. Затим позивајте API на релативној путањи (/api/...) уместо пуног URL-а. - 5
Избегавајте CORS у продукцији
Најбоље решење је да фронтенд и API буду на истом оригин-у (исти домен и порт). Ако нису, користите реверсе proxy који прослеђује
/apiна бацкенд. Тако прегледач не шаље cross-origin захтев. - 6
Проверите proxy и хостинг конфигурацију
Ако користите Nginx, Apache или цлоуд хостинг, уверите се да не уклањају CORS заглавља. У Nginx-u користите
proxy_passиadd_headerна правом нивоу. На serverless платформама (Vercel, Netlify) подесите CORS у заглављима одговора функција или у одговарајућој конфигурацији. - 7
Тестирајте са цурл-ом
Симулирајте префлигхт:
curl -i -X OPTIONS http://localhost:8080/api/podaci -H "Origin: http://localhost:3000" -H "Access-Control-Request-Method: GET". Проверите да ли одговор садржиAccess-Control-Allow-OriginиAccess-Control-Allow-Methods. Ако не садржи, проблем је на серверу. - 8
Очистите кеш и поново учитајте
Прегледачи могу да кеширају префлигхт одговоре према заглављу
Access-Control-Max-Age. Сачекајте да истекне, рестартујте прегледач или привремено смањите ту вредност на серверу. У DevTools укључите "Дисабле cache" и освежите страницу. Понекад је потребно рестартовати развојни server да bi се примениле измене конфигурације.
Ако ништа не помогне: напредне провере
Проверите да ли server враћа CORS заглавља само за успешне одговоре. Ако апликација баци грешку 500, CORS заглавља можда изостану, па прегледач пријави CORS уместо праве грешке. У том случају прво поправите серверску грешку. Затим, користите алат као што је curl или Постман да видите сиров одговор. Обратите пажњу на редирецт-е: ако server преусмерава http на https, CORS заглавља се могу изгубити. На крају, проверите да ли имате више слојева (CDN, лоад баланцер, proxy) и да ли неки од њих брише заглавља. У продукцији никада не користите Access-Control-Allow-Origin: * ако апликација користи колачиће или ауторизационе заглавља.
Како да спречите да се понови
- Дефинишите листу дозвољених оригин-а у конфигурацији сервера и ажурирајте је при свакој промени домена.
- Користите исти оригин за фронтенд и API где год је могуће, или реверсе proxy.
- Тестирајте CORS понашање аутоматским тестовима или цурл-ом пре објављивања.
- Избегавајте `*` за `Access-Control-Allow-Origin` када користите креденцијале.
Када је боље позвати стручњака
Ако сте испробали све кораке и CORS грешка и даље блокира апликацију, или ако немате приступ серверској конфигурацији, обратите се IT подршци или DevOps тиму. Они могу да провере proxy, хостинг и безбедносна правила.
Развој софтвера и производа · Апликације по мери, SaaS и MVP за 4 до 8 недељаЧеста питања
Зашто CORS грешка не постоји у Постман-у?
Постман и цурл не примењују CORS правила јер нису прегледачи. CORS је безбедносна мера прегледача, па се грешка јавља само у прегледачу. То потврђује да је проблем у заглављима сервера, а не у мрежи.
Могу ли да решим CORS на фронтенд-у?
Не можете трајно решити CORS на фронтенд-у јер прегледач блокира читање одговора, или сам захтев код префлигхт-а, пре него што подаци стигну до вашег JavaScript кода. Једино решење је да server пошаље исправна заглавља или да користите proxy.
Шта значи грешка "Цредентиал ис нот supported иф тхе CORS хеадер ис wildcard"?
То значи да шаљете креденцијале (на пример колачиће) док server враћа `Access-Control-Allow-Origin: *`. Прегледач то не дозвољава. Server мора да врати тачан оригин и `Access-Control-Allow-Credentials: true`.