2013-06-15 27 views
20

Tôi đang viết một máy chủ web demo nhỏ cung cấp tĩnh html, css và javascript. Máy chủ trông giống nhưLàm cách nào để thêm CORS-Headers vào một máy chủ kết nối tĩnh?

(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'); 
    }); 
})(); 

bên My client javascript làm ajax gọi đến một máy chủ khác nhau. Làm thế nào tôi có thể thêm

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

để phản ứng máy chủ của tôi, do đó phía khách hàng javascript có thể thực hiện cuộc gọi ajax?

Trả lời

16

Có một chút khó khăn trong việc tìm hiểu điều này từ express đã làm hỏng tôi.

Hãy xem enable cors. Về cơ bản những gì bạn cần làm là thêm Access-Control-Allow-Origin vào miền bạn muốn bật cors. response.setHeaders là hoàn hảo cho công việc này.

Một điều cần lưu ý khác là kết nối không có cách nào để xử lý các tuyến đường. Nếu ứng dụng của bạn cần phải có các tuyến đường khác nhau thì bạn có thể sẽ phải viết logic cho mỗi người trong số họ và thêm tiêu đề res vào những cái mà bạn muốn bật cors. Bạn có thể sử dụng req.url cho nó.

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'); 
}); 

Đây là câu trả lời tôi nhận được trong các công cụ dev 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 
+0

Cảm ơn rất nhiều, hoàn toàn hoàn hảo! – afx

+0

Vui vì tôi có thể giúp :) –

6

Tôi hy vọng điều này sẽ giúp:

//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')); 
}); 

Xem chi tiết: How to allow CORS?

+2

res.header phải là res.setHeader để kết nối phần mềm trung gian 2.0 trở lên – depthfirstdesigner

2

Phương pháp đơn giản nhất, nếu bạn đang sử dụng gulp sẽ sử dụng plugin gulp được gọi là "gulp-connect" d "connect-modrewrite" và xác định một gulptask mới để chuyển hướng một api cụ thể. Điều này là để làm cho apache hoạt động như một Proxy cho api cụ thể, để bỏ qua yêu cầu trước chuyến bay, theo thứ tự để tránh vấn đề COR. Tôi đã sử dụng tác vụ gulp sau để khắc phục sự cố này.

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]' 
     ]) 
     ]; 
    } 
    }); 
}); 
0

express.static lấy đối tượng cấu hình. Bạn có thể cung cấp tài sản setHeaders và từ chức năng mà bạn có thể đặt tiêu đề cho câu trả lời:

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'); 
     } 
    })) 

Các tham số cho hàm này như sau:

  • res, đối tượng phản ứng.
  • path, đường dẫn tệp đang được gửi.
  • stat, đối tượng stat của tệp đang được gửi.

Tôi muốn có yêu cầu ở đây để tôi có thể đặt tiêu đề CORS theo điều kiện dựa trên tiêu đề Origin.

Các vấn đề liên quan