Условная переадресация портов по имени хоста

Я новичок в модуле node-http-proxy.

моя цель

Мне нужно использовать модуль предоставления нескольких SSL для нескольких субдоменов. Например; если пользователь звонит process.localhost:1443, то я должен направить вызов на process.localhost:2443, а если пользователь звонит на api.localhost:1443, то я должен направить вызов на api.localhost:3443

что происходит

Я написал приведенные ниже коды server.js. Однако, когда я пытаюсь позвонить process.localhost:1443, я получаю следующую ошибку:
D:\Work Space\...\http-proxy\node_modules\requires-port\index.js:13 protocol = protocol.split(':')[0]; TypeError: Cannot call method 'split' of undefined

protocol кажется undefined.

function required(port, protocol) {
  protocol = protocol.split(':')[0];

Что я должен делать?

сервер.js

var fs = require('fs'),
    httpProxy = require('http-proxy'),
    express = require('express'),
    app = require('./app').service,
    api = require('./api').service;

// PROXY
var options = {
  changeOrigin: true,
  forward: {
    'process.localhost': 'process.localhost:2443',
    'api.localhost' : 'api.localhost:3443'
  }
}

httpProxy.createServer(options).listen(1443, function() {
  console.log('Proxy is listening on port 1443')
})


// HTTP
app
.listen(2443, function() {
  console.log('PROCESS APP server is listening on port 2443')
})

api
.listen(3443, function() {
  console.log('API APP server is listening on port 3443')
})

person efkan    schedule 06.04.2015    source источник
comment
во-первых, у вас есть дополнительная цитата в httpProxy.createServer. также я никогда не видел поддомены, используемые с локальным хостом   -  person Plato    schedule 06.04.2015
comment
Спасибо Платон. Я думал, что должен только один сервер слушать 1443 порт. И тогда я могу раздать запрос по hostname . Но я не использовал hostname. targets недостаточно?   -  person efkan    schedule 06.04.2015
comment
Спасибо @apsillers, так что мне не стоит примерять localhost. Нужно ли мне? Я не мог найти другого способа маршрутизации портов.   -  person efkan    schedule 06.04.2015
comment
@ user3765109 Не могли бы вы уточнить, какую версию http-proxy вы используете? Я просмотрел примеры на https://github.com/nodejitsu/node-http-proxy и https://www.npmjs.com/package/http-proxy, но ни один из них не использует target так, как вы пользуемся. В примерах target — это либо строка, либо объект со свойствами host и port (target: { host: ..., port: ... }), а не отображение одного хоста+порта на другой.   -  person apsillers    schedule 06.04.2015
comment
Я нашел еще один устаревший пример stackoverflow.com/a/17846415/3765109 и обновил свой вопрос в соответствии с последними кодами http-proxy . Но это не работает.   -  person efkan    schedule 07.04.2015


Ответы (1)


Я мог бы решить эту проблему через кого-то из node-http-proxy форума.

var proxyTable = {}
proxyTable['api.localhost:1443'] = 'http://127.0.0.1:3443'
proxyTable['process.localhost:1443'] = 'http://127.0.0.1:2443'

var proxy = httpProxy.createServer({changeOrigin: true})

var http = require('http')
http.createServer(function(req, res) {

  var options = {
    target: proxyTable[req.headers.host]
  }

  proxy.web(req, res, options)

}).listen(1443, function() {
  console.log('Proxy server is listening on port 1443')
})

app.listen(2443, function() {
  console.log('APP server is listening on port 2443')
})

api.listen(3443, function() {
  console.log('API server is listening on port 3443')
})
person efkan    schedule 07.04.2015