Включите Access-Control-Allow-Origin для нескольких доменов в nodejs [дубликат]

Этот вопрос уже имеет ответ здесь:

Я пытаюсь позволить CORS в node.js, но проблема состоит в том, что я не могу установить * кому: Access-Control-Allow-Origin если Access-Control-Allow-Credentials установлен.

Также спецификация сказала, что я не могу сделать, массив или запятая разделили значение для Access-Control-Allow-Origin и предложенный метод должен был бы сделать что-то подобное этому Access-Control-Allow-Origin Несколько Доменов Источника?

Но я, может казаться, не делаю этот путь в node.js

["http://mydomain.com:9001", "http://mydomain.com:5001"].map(function(domain) {
  res.setHeader( "Access-Control-Allow-Origin", domain );
});
res.header( "Access-Control-Allow-Credentials", true );

Проблема здесь состоит в том, что это - удобное переопределение последним значением в массиве, таким образом, заголовок будет установлен на res.setHeader( "Access-Control-Allow-Origin", "http://mydomain.com:5001" );

Ошибка от клиентского браузера:

XMLHttpRequest не может загрузить http://mydomain.com:9090/api/sync. 'Access-Control-Allow-Origin' заголовок имеет значение 'http://mydomain.com:5001', который не равен предоставленному источнику. Источнику 'http://mydomain.com:9001' поэтому не предоставляют доступ.

62
задан 2 February 2019 в 12:49

4 ответа

Вот то, что я использую в своем специальном приложении для разрешения нескольких источников

app.use(function(req, res, next) {
  var allowedOrigins = ['http://127.0.0.1:8020', 'http://localhost:8020', 'http://127.0.0.1:9000', 'http://localhost:9000'];
  var origin = req.headers.origin;
  if(allowedOrigins.indexOf(origin) > -1){
       res.setHeader('Access-Control-Allow-Origin', origin);
  }
  //res.header('Access-Control-Allow-Origin', 'http://127.0.0.1:8020');
  res.header('Access-Control-Allow-Methods', 'GET, OPTIONS');
  res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
  res.header('Access-Control-Allow-Credentials', true);
  return next();
});
155
ответ дан 31 October 2019 в 13:18

Не уверенный, если это к последнему, но я решил его путем установки: res.setHeader("Access-Control-Allow-Origin", req.headers.origin);

Это просто позволит каждое соединение, когда headers.origin будет отправлен с каждым запросом.

можно хотеть записать функцию, чтобы проверить, является ли req.headers.origin доменом в белом списке (от массива hardcoded) и просто возврат этот домен, если это существует в массиве.

10
ответ дан 31 October 2019 в 13:18

Проверьте свой белый список по тому, чем Обладают Ваши req.headers.origin, например,

var origins = ['a.com', 'b.com', 'c.com', 'boobies.com'];
for(var i=0;i<origins.length;i++){
    var origin = origins[i];
    if(req.headers.origin.indexOf(origin) > -1){ 
         res.setHeader('Access-Control-Allow-Origin', req.headers.origin);
         return;
    }
    // else, tough cookies. 
}

.

6
ответ дан 31 October 2019 в 13:18

Вот простая функция промежуточного программного обеспечения для подавания корректного заголовка CORS из белого списка. При установке этой близости верхняя часть специального приложения позволит всем маршрутам устанавливать надлежащий заголовок из белого списка прежде, чем подать содержание.

app.use(function(req, res, next){
  var whitelist = ['localhost:4000', 'localhost:3000', 'anydomain.com']
  var host = req.get('host');

  whitelist.forEach(function(val, key){
    if (host.indexOf(val) > -1){
      res.setHeader('Access-Control-Allow-Origin', host);
    }
  })

  next();
});
6
ответ дан 31 October 2019 в 13:18

Другие вопросы по тегам:

Похожие вопросы: