У меня проблема с CORS. Мне всегда отказывают в клиентском api (ошибка консоли в конце статьи). Теперь мне интересно, не моя ли это вообще вина. Надеюсь с твоей помощью найти брешь.
У меня получилась следующая настройка:
В моей ответственности: domain-a.com: NGINX ------ УГЛОВОЙ интерфейс ------ Бэкэнд SpringBoot
В ответственности клиентов: domain-b.com: /adrstep.json
domain-b.com обслуживает JSON при вызове GET на /adrstep.json. Это отлично работает при вызове прямо из браузера.
В угловой части я называю domain-a.com/adrstep/adrstep.json, это переписывается в NGINX на domain-b.com/adrstep.json. Вот что я получаю в Chrome:
На вкладке CHROME NETWORK:
Запрос от браузера к NGINX:
GENERAL:
Request URL: https://domain-a.com/adrsteps/adrstep.json
Request Method: GET
Status Code: 302 Moved Temporarily
Remote Address: 212.25.3.166:443
Referrer Policy: no-referrer-when-downgrade
RESPONSE HEADER:
HTTP/1.1 302 Moved Temporarily
Server: nginx
Content-Type: text/html
Connection: keep-alive
Location: https://domain-b.com
Access-Control-Allow-Origin: https://domain-b.com
Access-Control-Allow-Methods: GET, OPTIONS
Access-Control-Allow-Headers: Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With
REQUEST HEADER:
GET /adrsteps/adrstep.json HTTP/1.1
Host: domain-a.com
Connection: keep-alive
Accept: application/json, text/plain, */*
Content-Type: application/json
Referer: https://domain-a.com
Accept-Encoding: gzip, deflate, br
Перенаправленный запрос от NGINX к api на domain-b.com:
GENERAL
Request URL: https://domain-b.com/adrstep.json
Request Method: OPTIONS
Status Code: 200 OK
Remote Address: 193.246.69.8:443
Referrer Policy: no-referrer-when-downgrade
RESPONSE HEADER
HTTP/1.1 200 OK
Content-Type: text/plain
Content-Length: 0
Connection: keep-alive
Status: 200 OK
Age: 0
Strict-Transport-Security: max-age=86400; includeSubdomains
X-Frame-Options: SAMEORIGIN
Frame-Options: SAMEORIGIN
REQUEST HEADER
OPTIONS /adrstep.json HTTP/1.1
Host: domain-b.com
Connection: keep-alive
Access-Control-Request-Method: GET
Origin: https://domain-a.com
Access-Control-Request-Headers: authorization,content-type,x-requested-with
Accept: */*
Accept-Encoding: gzip, deflate, br
Конфигурация NGINX:
location /adrsteps/ {
add_header 'Access-Control-Allow-Origin' 'https://domain-b.com' always;
add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,...
rewrite ^(\/adrsteps\/) https://domain-b.com/adrsteps.json$2 break;
proxy_redirect off;
}
Ошибка консоли браузера:
Failed to load https://domain-b.com/adrsteps.json?: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://domain-a.com' is therefore not allowed access.
Кто-нибудь знает, где может быть проблема? Я ясно вижу Access-Control-Allow-Origin
в заголовке моего запроса ... Заранее спасибо.
Благодаря графику, опубликованному @Craft, я пошел в правильном направлении. Но решение было не на стороне клиента - это была ошибка конфигурации nginx. В конце концов мне пришлось rewrite
и proxypass
запрос. Я пропустил позднее.
Вот мой блок местоположения nginx:
location /adrsteps/ {
rewrite ^(\/adrsteps\/) /adrsteps.json$2 break;
proxy_pass https://domain-b.com;
proxy_redirect off;
add_header 'Access-Control-Allow-Origin' 'https://domain-b.com' always;
add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With' always;
}
Кстати: как определить, правильно ли реализован CORS на вашей стороне или на стороне клиента, просто используйте CORS-Toggle. Если он работает с переключателем (он добавляет Access-Control-Allowed-Origin = '') ошибка будет на вашей стороне. *
Вы должны разрешить Origin https://domain-a.com
в конфигурации vhost domain-b.com
потому что браузер проверяет, если https://domain-a.com
разрешено делиться ресурсами, размещенными на сайте https://domain-b.com
.
Эта ссылка может вам немного помочь: https://upload.wikimedia.org/wikipedia/commons/c/ca/Flowchart_showing_Simple_and_Preflight_XHR.svg
Я надеюсь, это поможет!