2016-12-27 2 views
6
내가 뭘하려고 오전

:노드 프록시 - 프록시 기본 HTTP 서버에서 SSL localhost를 대상

프록시를 위해 비 SSL http://127.0.0.1:1337/에서 실행 측면을 따라 https://127.0.0.1:443/api/ 내 UI를 실행하는 자바 API를 일부 CORS 문제를 일거수기했다.

내 시도 :

  1. 프록시 1338 년
  2. 프록시 내 비 SSL 개발 포트에 SSL 포트 443에서 API를 :8080/index.html 및 프록시 1337
  3. 내 UI 프록시 1137 8080
: 1338 액세스 로컬 호스트에서 내 응용 프로그램
  • :8080/api/

    내 문제 :

    UI를 잘 온다 ...하지만 난 :8080/api/httpSession/init

    에서 API를 공격 할 수 그래, 난 여전히 https://localhost/api/httpSession/init

    api.js에서 API를 칠 수있다 - 프록시 133 1,337

    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 -은 index.html을 렌더링을 7 1338 프록시 문제에 대한

    // 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

    필요한 것을 얻기 위해 리버스 프록시로 nginx를 사용하는 것이 좋습니다. [여기] (https://www.garron.me/en/linux/nginx-reverse-proxy.html)는 필요한 것과 비슷한 것을 얻기위한 지침입니다. [이] (http://serverfault.com/questions/706694/use-nginx-as-reverse-proxy-for-multiple-servers)도 도움이됩니다 ... – mkhanoyan

    +0

    API를 두 번 프록시하는 이유가 있습니까? ? 먼저 1338 번 포트로, 그 다음 포트 8080으로/api /? –

    +0

    나는 이것이 주제에서 벗어나지 만 같은 포트에서 이것을 달성하기 위해 역방향 프록시가있는 웹 서버를 사용할 수도 있음을 알고 있습니다. 예를 들어 IIS 또는 Nginx를 사용하여 하나의 가상 서버에서 역방향 프록시 끝점을 구분할 수 있습니다. –

    답변

    2

    당신이 찾고있는 것은 request piping입니다. 이 예제를보십시오 :

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

    는 API는 this SO solution으로 도달 할 수없는 경우 처리 일부 오류를 추가해야합니다.

    1

    8080에, 내 생각은 URL에 /api/*을 유지하고 그 사용자의 API 서비스의 라우터에 존재하지 않는 점이다. API 서비스의 라우터에 /api을 추가하면 URL 문자열을 전송할 때 URL 문자열을 그대로 유지할 수 있습니다. 그렇지 않으면 API가 요청을 라우트와 일치 시키도록 url을 프록시하고 재 작성해야합니다.

    또 다른 참고로, cors 모듈을 설치하고 앱에서 사용하는 것은 어떨까요? 나는 비슷한 것을하고 모든 프록시 아이템없이 잘 작동한다. https://www.npmjs.com/package/cors