Мы используем cookie-файлы
Для оптимизации работы нашего сайта мы используем cookie-файлы. Продолжая использовать сайт, Вы соглашаетесь с использованием cookie-файлов.
Панель управления
  • Русский
  • Українська
  • UAH
  • USD
  • RUB
  • EUR
  • +38(044) 392-74-33  Киев
  • +38(057) 728-39-00  Харьков
  • +38(056) 794-38-31  Днепр
  • +38(032) 229-58-93  Львов
  • +38(048) 738-57-70  Одесса
  • +38(093) 170-15-42  Life
  • +38(067) 400-88-44  Киевстар
  • +38(095) 630-90-82  Vodafone
  • +1(888)393-24-51  USA, Toll free
  • +44(131)507-01-14  Great Britain
  • +7(499) 348-28-61  Москва

2.20.16. Не работает AJAX-запрос к другим доменам

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 равноценно тому же, что и указание запрета на использование ресурсов.

Решить проблему можно несколькими способами:

  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"