2.4.3.16. Памылкі CORS і праблемы крос-сайтавых AJAX-запытаў
Важныя моманты:
- Загаловак
Access-Control-Allow-Origin
усталёўваецца на сэрвэры, дзе размяшчаецца запытаны сайтам рэсурс. - Загаловак
Access-Control-Allow-Origin
павінен вяртацца толькі адзін. Пры дубляванні загалоўка браўзэр будзе вяртаць памылку яго выкарыстання.
XMLHttpRequest — гэта API, які выкарыстоўваецца JS—скрыптамі для адпраўкі запытаў да сервера. Даволі часта ён выкарыстоўваецца для стварэння інтэрактыўных старонак з загрузкай дадзеных на лета без перазагрузкі старонкі. Выкарыстанне такога API даволі папулярна, але ў мэтах бяспекі па змаўчанні можна дасылаць запыты толькі ў рамках аднаго дамена. Такая бяспека арганізавана дзякуючы выкарыстанню CORS, Які абмяжоўвае ўсе крос-сайтовые HTTP-запыты.
Для ўказанні адрасы, адкуль быў выраблены запыт, выкарыстоўваецца загаловак Origin
. Выглядае дадзены загаловак прыкладна так:
GET /example/ HTTP/1.1 User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36 Accept: application/json, text/plain, */* Referer: http://for.example.com/ Origin: http://for.example.com
Адказ ад сервера, на такі запыт, можа быць прыкладна наступным:
HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8 Date: Sat, 01 Jan 2001 00:00:00 GMT Server: nginx Content-Length: 35 Connection: keep-alive Access-Control-Allow-Origin: http://for.example.com
У гэтым выпадку загаловак Access-Control-Allow-Origin
дазваляе запыты з названага адрасы і забараняе з іншых адрасоў. Менавіта па прычыне адсутнасці такога загалоўка можа ўзнікаць праблема пры крос-даменных запытах. Прынцып працы загалоўка Access-Control-Allow-Origin
складаецца ў тым, каб забараняць або дазваляць выкарыстоўваць рэсурсы аднаго сайта ў рамках іншых сайтаў. адсутнасць загалоўка Access-Control-Allow-Origin
раўнацэнна таго ж, што і ўказанне забароны на выкарыстанне рэсурсаў.
Вырашыць праблему можна некалькімі спосабамі:
Важныя моманты:
- Даданне загалоўкаў з дапамогай PHP прыярытэтнае, чым налада праз .htaccess. У такім выпадку, калі ў рамках сайта ў PHP-скрыптах настроена пэўная палітыка CORS, указанне іншых дадзеных праз .htaccess не зменіць загалоўкі.
- Спосабы рэалізацыі перадачы загалоўкаў CORS з дапамогай PHP і праз .htaccess не будуць працаваць для статычных файлаў, так як іх апрацоўка вырабляецца вэб-серверам nginx. Каб усталяваць налады палітыкі CORS для статычных файлаў, трэба скарыстацца першым спосабам.
- Для статычных файлаў можна ўсталяваць параметр у наладах сайта, Які будзе паказваць на дазвол доступу з любога адрасы (Звярніце ўвагу: дадзены спосаб не дзейнічае на файлы, якія не пазначаны ў спісе статычных):
- У PHP-скрыптах загружаных старонак (На якія вырабляюцца запыты) трэба паказаць такія дырэктывы:
header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Headers: X-Requested-With, Content-Type, Accept, Origin, Authorization'); header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
У такім выпадку запыты будуць дазволеныя з любога адрасы без якой-небудзь абароны. замест сімвала
*
можна паказаць адрас сайта, з якога будуць дазволеныя запыты, у выглядзеhttp://example.com
. - У файле .htaccess трэба паказаць дырэктывы дадання загалоўкаў:
Header add Access-Control-Allow-Origin "*" Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type" Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"
Для дазволу доступу некалькіх адрасах іх трэба паказаць з новага радка, да прыкладу так:
Header add Access-Control-Allow-Origin "http://some.for.example.com" Header add Access-Control-Allow-Origin "http://for.example.com" Header add Access-Control-Allow-Origin "http://example.com"