Прескочи на садржај
EVI Solutions

CORS грешка у прегледачу: узроци и решења за девелопере

Средње 20 мин Ažurirano:

Кратак одговор

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. 1

    Проверите тачан оригин у прегледачу

    Отворите DevTools (Ф12) и у конзоли укуцајте location.origin. Запишите тачну вредност, на пример http://localhost:3000. У картици Network пронађите неуспешан захтев и погледајте заглавља захтева и одговора. Обратите пажњу на Origin у захтеву и Access-Control-Allow-Origin у одговору.

  2. 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. 3

    Обрадите OPTIONS префлигхт

    Проверите да ли server враћа 204 или 200 на OPTIONS захтев са заглављима Access-Control-Allow-Methods и Access-Control-Allow-Headers. У Express-u то ради cors middleware аутоматски. У Nginx-u додајте add_header Access-Control-Allow-Origin ... и if ($request_method = OPTIONS) { return 204; }.

  4. 4

    Користите proxy током локалног развоја

    Ако не можете да мењате server, подесите proxy у развојном алату. У Вите: server.proxy у vite.config.js. У Цреате React App: proxy поље у package.json. Затим позивајте API на релативној путањи (/api/...) уместо пуног URL-а.

  5. 5

    Избегавајте CORS у продукцији

    Најбоље решење је да фронтенд и API буду на истом оригин-у (исти домен и порт). Ако нису, користите реверсе proxy који прослеђује /api на бацкенд. Тако прегледач не шаље cross-origin захтев.

  6. 6

    Проверите proxy и хостинг конфигурацију

    Ако користите Nginx, Apache или цлоуд хостинг, уверите се да не уклањају CORS заглавља. У Nginx-u користите proxy_pass и add_header на правом нивоу. На serverless платформама (Vercel, Netlify) подесите CORS у заглављима одговора функција или у одговарајућој конфигурацији.

  7. 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. 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`.

Подели
Нисте нашли решење?AI IT асистент је доступан 24/7. Опишите проблем или пошаљите screenshot грешке и добићете упутство за ваш случај.Питајте AI IT асистента