2016-12-27 21 views
6

Próbuję zrobić:węzła proxy - Proxy cel localhost SSL z podstawowego serwera http

Proxy API Javy, który działa na https://127.0.0.1:443/api/ wzdłuż boku mojego UI, który działa na non-SSL http://127.0.0.1:1337/ w celu opłynąć niektóre problemy CORS.

Moja próba:

  1. Proxy API SSL na porcie 443 do mojego non-SSL portu rozwojowej 1338
  2. pełnomocnika mój UI do 1337
  3. Proxy 1137 do :8080/index.html i pełnomocnika 1338 do :8080/api/
  4. Dostęp moja aplikacja z localhost: 8080

Mój problem:

UI jest w porządku ... ale nie mogę trafić na API w :8080/api/httpSession/init

Tak, mogę wciąż hit API w https://localhost/api/httpSession/init

api.js - świadczy na index.html w: 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 - pośredniczy 133 7 i 1338 do 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

Polecam używać nginx jako odwrotnego proxy, aby osiągnąć to, czego potrzebujesz. [Tutaj] (https://www.garron.me/en/linux/nginx-reverse-proxy.html) to instrukcje, aby osiągnąć coś podobnego do tego, czego potrzebujesz. [To] (http://serverfault.com/questions/706694/use-nginx-as-reverse-proxy-for-multiple-servers) powinno również pomóc ... – mkhanoyan

+0

Czy jest powód, że serwer proxy pośredniczy w twoich api dwukrotnie? ? Najpierw port 1338, a następnie port 8080 w/api /? –

+0

Wiem, że to nie temat, ale możesz również użyć serwera WWW z odwrotnym proxy, aby osiągnąć to na tym samym porcie. Na przykład można użyć usług IIS lub Nginx, aby oddzielić odwrotne punkty końcowe proxy na jednym serwerze wirtualnym. –

Odpowiedz

2

To, czego szukasz, to request piping. Wypróbuj ten przykład:

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

Upewnij się, aby dodać trochę obsługi błędów, jeśli API nie może być osiągnięte, takich jak this SO solution.

1

Do wydania proxy, domyślam się, że to jest utrzymanie /api/* w adresie URL, a to nie jest obecny na routerze w usłudze API. Możesz spróbować dodać /api do routera w usłudze API, ponieważ będzie utrzymywał ten sam ciąg adresu URL podczas wysyłania. W przeciwnym razie najprawdopodobniej będziesz potrzebować proxy i przepisać adres URL, aby interfejs API dopasował żądanie do trasy.

W innej notatce, a co dopiero po zainstalowaniu modułu cors i użyciu w aplikacji? Robię coś podobnego i działa dobrze bez wszystkich elementów proxy. https://www.npmjs.com/package/cors