2016-12-27 14 views
6

Những gì tôi đang cố gắng để làm:Node Proxy - Proxy một mục tiêu SSL localhost từ một máy chủ http cơ bản

Proxy một api java chạy trên https://127.0.0.1:443/api/ cùng bên UI của tôi chạy trên phi SSL http://127.0.0.1:1337/ theo thứ tự để đi vòng quanh một số vấn đề của CORS.

nỗ lực của tôi:

  1. Proxy api tại cảng SSL 443 để phi SSL cổng phát triển của tôi của 1338.
  2. Proxy UI của tôi để 1337
  3. Proxy 1.137-:8080/index.html và proxy 1338 đến :8080/api/
  4. Truy cập ứng dụng của tôi từ máy chủ cục bộ: 8080

Vấn đề của tôi:

Giao diện do thỏa thuận hợp tốt ... nhưng tôi không thể nhấn API tại :8080/api/httpSession/init

Vâng, tôi vẫn có thể nhấn API tại https://localhost/api/httpSession/init

api.js - Renders index.html tại địa chỉ: 1337

var app = express(); 

app.all('*', function (req, res, next) { 
    res.header('Access-Control-Allow-Origin', '*'); 
    res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS'); 
    res.header('Access-Control-Allow-Headers', 'Content-Type'); 
    next(); 
}); 

var options = { 
    changeOrigin: true, 
    target: { 
     https: true 
    } 
}; 

httpProxy.createServer(443, '127.0.0.1', options).listen(1338); 

start.js - Proxy 133 7 và 1338 thành 8080

// First I start my two servers 
uiServer.start(); // renders index.html at 1337 
apiServer.start(); // 

// I attempt to patch them back into one single non-SSL port. 
app 
    .use('/', proxy({target: 'http://localhost:1337/'})) 
    .all('/api/*', proxy({target: 'http://localhost:1338/'})) 
    .listen(8080, function() { 
    console.log('PROXY SERVER listening at http://localhost:%s', 8080); 
    }); 
+0

Tôi khuyên bạn nên sử dụng nginx làm proxy ngược để đạt được những gì bạn cần. [Ở đây] (https://www.garron.me/en/linux/nginx-reverse-proxy.html) là một số hướng dẫn để đạt được một cái gì đó tương tự như những gì bạn cần. [Điều này] (http://serverfault.com/questions/706694/use-nginx-as-reverse-proxy-for-multiple-servers) cũng sẽ giúp ... – mkhanoyan

+0

Có lý do nào bạn đang ủy nhiệm api của bạn hai lần ? Đầu tiên đến cổng 1338, sau đó đến cổng 8080 tại/api /? –

+0

Tôi biết điều này là tắt chủ đề nhưng bạn cũng có thể sử dụng một máy chủ web với proxy ngược để đạt được điều này trên cùng một cổng. Ví dụ, bạn có thể sử dụng IIS hoặc Nginx để tách riêng các điểm cuối proxy ngược trên một máy chủ ảo. –

Trả lời

2

Điều bạn đang tìm kiếm là request piping. Hãy thử ví dụ này:

// Make sure request is in your package.json 
    // if not, npm install --save request 
    var request = require('request'); 

    // Intercept all routes to /api/... 
    app.all('/api/*', function (req, res) { 
    // Get the original url, it's a fully qualified path 
    var apiPath = req.originalUrl; 

    // Form the proxied URL to your java API 
    var url = 'https://127.0.0.1' + apiPath; 

    // Fire off the request, and pipe the response 
    // to the res handler 
    request.get(url).pipe(res); 
    }); 

Hãy chắc chắn để thêm một số lỗi xử lý nếu api không thể đạt được, chẳng hạn như this SO solution.

1

Đối với vấn đề proxy, tôi đoán là nó được giữ /api/* trong url và đó là không có mặt trên router phục vụ API của bạn. Bạn có thể thử thêm /api vào bộ định tuyến trong dịch vụ API vì nó sẽ giữ chuỗi url giống nhau khi nó gửi nó. Nếu không, bạn có thể cần ủy quyền và viết lại url để API sẽ khớp với yêu cầu tới tuyến đường.

Lưu ý khác, bạn chỉ cần cài đặt mô-đun cors và sử dụng trong ứng dụng? Tôi làm một cái gì đó tương tự và nó làm việc tốt mà không có tất cả các mục proxy. https://www.npmjs.com/package/cors

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