Как добавить заголовки CORS на статический сервер connect?

Я пишу небольшой демонстрационный веб-сервер, предоставляющий статический html, css и javascript. Сервер выглядит как

(function () {
    "use strict";

    var http = require("http");
    var connect = require('connect');
    var app = connect()
        .use(connect.logger('dev'))
        .use(connect.static('home'));

    var server = http.createServer(app);
    server.listen(9999, function () {
        console.log('server is listening');
    });
})();

мой клиентский javascript делает ajax-вызовы на другой сервер. Как я могу добавить

Access-Control-Allow-Origin: http://example.com

к моему ответу сервера, чтобы javascript на стороне клиента мог выполнить вызов ajax?

4 ответов


было немного трудно понять это, так как экспресс испортил мне.

посмотри включить cors. В основном, что вам нужно сделать, это добавить Access-Control-Allow-Origin к домену, который вы хотите включить cors on. ответ.setHeaders идеально подходит для этой задачи.

еще одна вещь, чтобы отметить, что connect не имеет возможности обрабатывать маршруты. Если ваше приложение должно иметь разные маршруты, вам, вероятно, придется написать логику для каждого из них и добавьте заголовки res к тем, на которых вы хотите включить cors. Вы можете использовать req.url для него.

var http = require("http");
var connect = require('connect');

var app = connect()

    .use(connect.logger('dev'))

    .use(connect.static('home'))

    .use(function(req, res){

    res.setHeader("Access-Control-Allow-Origin", "http://example.com");
    res.end('hello world\n');

 });

var server = http.createServer(app);

server.listen(9999, function () {

    console.log('server is listening');
});

это ответ, который я получил в chrome dev tools

HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://example.com
Date: Sat, 15 Jun 2013 16:01:59 GMT
Connection: keep-alive
Transfer-Encoding: chunked

надеюсь, это поможет:

//CORS middleware
var allowCrossDomain = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', config.allowedDomains);
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header('Access-Control-Allow-Headers', 'Content-Type');

    next();
}

//...
app.configure(function() {

    app.use(allowCrossDomain);
    app.use(express.static(__dirname + '/public'));
});

более подробно: как разрешить CORS?


самый простой метод, если вы используете gulp, будет использовать плагин gulp под названием "gulp-connect" и "connect-modrewrite" и определить новую gulptask для перенаправления определенного api. Это должно заставить apache действовать как прокси для конкретного api, обойти запрос перед полетом, чтобы избежать проблемы CORs. Я использовал следующую задачу gulp для преодоления этой проблемы.

var connect = require('gulp-connect'),
    modRewrite = require('connect-modrewrite');
/**
* Proxy Config
*/
gulp.task('connect', function () {
  connect.server({
    root: ['./.tmp', './.tmp/{folderLocations}', './src', './bower_components'],
    port: 9000,
    livereload: true,
    middleware: function (connect, opt) {
      return [
        modRewrite([
          '^/loginProxy/(.*)$ http://app.xyzdomain.com/service/login/auth/ [P]'
        ])
      ];
    }
  });
});

express.static объект конфигурации. Вы можете предоставить свойство setHeaders и из этой функции вы можете установить заголовки для ответа:

    app.use(express.static('public', {
      setHeaders: function setHeaders(res, path, stat) {
        res.header('Access-Control-Allow-Origin', '*');
        res.header('Access-Control-Allow-Methods', 'GET');
        res.header('Access-Control-Allow-Headers', 'Content-Type');
      }
    }))

параметры этой функции являются:

  • res объект ответа.
  • path путь к файлу, который отправляется.
  • stat, объект stat файла, который отправляется.

Я желаю, чтобы запрос был доступен здесь, чтобы я мог условно установить заголовки CORS на основе .