azovl
@azovl

No 'Access-Control-Allow-Origin' header is present on the requested resource. Как исправить ситуацию?

Использую в проекте Ionic, Socket.io. Бэкенд написан на node.js.
Пытаюсь с помощью клиента достучаться до сервера который расположен в облаке Cloud9.
Выдает ошибку:
XMLHttpRequest cannot load https:/URL. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin '192.168.10.159:8100' is therefore not allowed access.

Как я понимаю, проблема в безопасности, в том что Chrome не дает доступ к внешнему ресурсу.
Пробовал:
1) "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files --disable-web-security
2) ionic project
"proxies": {
"path": "/chat",
"proxyUrl": "https://..."
}

3) Пробовал плагин отключающий/включающий CORS для Chrome.
Везде одинаково. Не помогает

Обращаюсь к серверу через сервис:
angular.module('starter')

.factory('Socket', function (socketFactory) {
  var url = 'https:...';  
  var myIoSocket = io.connect( url );

  mySocket = socketFactory({
    ioSocket: myIoSocket
  });

  return mySocket;
});


На сервере:
// Including Express.js
var express = require('express');
// Creating app Express
var app = express();

// Creating server using express and http
var server = require('http').createServer(app);


Как излечить данный недуг, поскольку далее идти не вариант...?

P.S. Изменил сервер

var express = require('express');
var app = express();
var http = require('http');
var server = http.createServer(app);

server.on('request', function(req, res) {
res.writeHead(200, {
'Content-Type': 'text/event-stream; charset=utf-8',
'Cache-Control': 'no-cache',
'Access-Control-Allow-Origin': '*'
});

res.end();
})


В данном случае имею другую ошибку: XMLHttpRequest cannot load https://URL. A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true. Origin '192.168.10.159:8100' is therefore not allowed access. The credentials mode of an XMLHttpRequest is controlled by the withCredentials attribute.

Как с этим быть?
  • Вопрос задан
  • 8955 просмотров
Решения вопроса 1
Я недавно EventSource тестил и обращался к cloud9 через angular2. Была такая же проблема.
Решил установкой Access-Control-Allow-Origin на сервере через
res.writeHead(200, {
  'Access-Control-Allow-Origin': '*',
  // 'Access-Control-Allow-Credentials': true 
});

Еще вариант если используется express
var express = require('express'), 
  cors = require('cors'), 
  app = express();

app.use(cors());
// или
app.use(cors({
    origin: true,
    credentials: true
}));
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
AMar4enko
@AMar4enko
1) ionic прокси должен работать
2) Chrome, запущенный с флагом должен работать (но его нужно запускать с нуля - если Chrome уже открыт, то он просто на передний план вылезет, без применения флага, само собой)
Ответ написан
Комментировать
NullByte
@NullByte
Bad gateway
Заставьте сервер выдавать в заголовке этот параметр. та же хрень была у меня.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы