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 для статычных файлаў, трэба скарыстацца першым спосабам.
  1. Для статычных файлаў можна ўсталяваць параметр у наладах сайта, Які будзе паказваць на дазвол доступу з любога адрасы (Звярніце ўвагу: дадзены спосаб не дзейнічае на файлы, якія не пазначаны ў спісе статычных):
  2. У 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.

  3. У файле .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"
Змест