Avatar ·

Как отключить политику same-origin в Chrome для тестирования AJAX-запросов?

Привет всем! Я новичок в веб-разработке и пишу небольшое приложение на чистом JavaScript. Мне нужно сделать AJAX-запрос к стороннему API (например, к сервису погоды), чтобы получить данные и отобразить их на странице. Но когда я запускаю свой код локально (просто открываю index.html в браузере), в консоли Chrome появляется ошибка: Access to XMLHttpRequest at 'https://api.example.com/data' from origin 'null' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Я понимаю, что это связано с политикой same-origin (ограничение доступа к ресурсам с другого домена). Я читал, что можно запустить Chrome с отключенной этой политикой для разработки, но не могу найти рабочий способ. Пробовал флаг --disable-web-security, но он не помогает — ошибка всё равно появляется. Мой код выглядит так: ```javascript const xhr = new XMLHttpRequest(); xhr.open('GET', 'https://api.example.com/data', true); xhr.onload = function() { console.log(xhr.responseText); }; xhr.send(); ``` Подскажите, как правильно отключить same-origin policy в Chrome для локального тестирования? Или есть другой способ обойти эту проблему без изменения настроек браузера? Заранее спасибо! <<>>

Проблема: CORS и same-origin policy

Вы столкнулись с классической проблемой веб-разработки — политикой Same-Origin (одинакового источника). Браузер Chrome (и другие) блокирует запросы к другому домену, протоколу или порту, если сервер явно не разрешил это через заголовок Access-Control-Allow-Origin. Отключение этой политики через флаги — временное решение для разработки, но оно часто не работает, если вы просто открываете HTML-файл локально (из-за origin 'null').

Правильный способ: запуск Chrome с флагами

Чтобы временно отключить same-origin policy, нужно закрыть все окна Chrome и запустить его из командной строки (терминала) с флагом --disable-web-security и указанием папки для данных пользователя. Вот как это сделать:

  1. Закройте все окна Chrome — это обязательно, иначе флаг не сработает.
  2. Откройте терминал (командную строку):
    • Windows: Win + R, введите cmd.
    • macOS: Cmd + Space, введите Terminal.
    • Linux: Ctrl + Alt + T.
  3. Запустите Chrome с флагами. Пример для Windows:
"C:\Program Files\Google\Chrome\Application\chrome.exe" --disable-web-security --user-data-dir="C:\temp\chrome_dev"

Для macOS:

open -n -a /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --args --user-data-dir="/tmp/chrome_dev" --disable-web-security

Для Linux:

google-chrome --disable-web-security --user-data-dir="/tmp/chrome_dev"

Флаг --user-data-dir создаёт временный профиль, чтобы не повлиять на ваши основные данные. После запуска Chrome покажет предупреждение о небезопасном режиме — это нормально.

Альтернатива: локальный сервер

Вместо отключения безопасности браузера, лучше запустить локальный веб-сервер. Это решит проблему origin 'null' и позволит тестировать CORS-запросы без изменения настроек Chrome. Проще всего использовать встроенный сервер Python:

python -m http.server 8000

Затем откройте в браузере http://localhost:8000/ваш_файл.html. Запросы к API будут отправляться с origin http://localhost:8000, что корректно для CORS (если сервер API поддерживает его).

Проверка работоспособности

После запуска Chrome с флагами или локального сервера ваш код должен работать. Обновлённый пример с обработкой ошибок:

const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/data', true);
xhr.onload = function() {
  if (xhr.status >= 200 && xhr.status < 300) {
    console.log('Данные получены:', xhr.responseText);
  } else {
    console.error('Ошибка:', xhr.status);
  }
};
xhr.onerror = function() {
  console.error('Сетевая ошибка');
};
xhr.send();

Важно: Никогда не используйте --disable-web-security для просмотра обычных сайтов — это опасно! Только для локальной разработки.

<<>>

Использование CORS-прокси для обхода ограничений

Если вы не хотите запускать Chrome с флагами или настраивать локальный сервер, можно использовать публичный CORS-прокси. Такие сервисы добавляют заголовок Access-Control-Allow-Origin: * к вашему запросу. Пример с сервисом corsproxy.io:

const url = 'https://api.example.com/data';
const proxyUrl = 'https://corsproxy.io/?' + encodeURIComponent(url);

const xhr = new XMLHttpRequest();
xhr.open('GET', proxyUrl, true);
xhr.onload = function() {
  console.log(xhr.responseText);
};
xhr.send();

Однако у этого подхода есть недостатки:

  • Зависимость от стороннего сервиса — он может быть недоступен или медленным.
  • Ограничения по количеству запросов (часто есть лимиты).
  • Потенциальные проблемы с безопасностью — вы передаёте данные через чужой сервер.

Для быстрого тестирования это подойдёт, но для серьёзной разработки лучше использовать локальный сервер или настроить свой прокси (например, через Node.js с пакетом cors-anywhere).