我如何将CORS-Headers添加到静态连接服务器?

我正在写一个演示Web服务器提供静态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调用?

因为快递已经宠坏了我,所以找出这个问题有点麻烦。

看看启用cors 。 基本上你需要做的是将Access-Control-Allow-Origin到你想启用cors的域。 response.setHeaders对于这个任务是完美的。

另外需要注意的是连接无法处理路由。 如果您的应用程序需要不同的路线,那么您可能必须为每个路线编写逻辑,并将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开发工具中得到的回应

 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-connect”和“connect-modrewrite”的gulp插件,并定义一个新的gulptask来redirect一个特定的api。 这是为了使Apache成为特定API的代理,绕过预先的请求,以避免CORs问题。 我用下面的一些任务来解决这个问题。

 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/$1 [P]' ]) ]; } }); }); 

express.static需要一个configuration对象。 您可以提供属性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 ,正在发送的文件path。
  • stat ,正在发送的文件的stat对象。

我希望这个请求在这里可用,这样我可以有条件地设置基于Origin头的CORS头。