2017-02-16 2 views
0

У меня есть экспресс-сервер, статически обслуживающий мой проект Polymer. У меня есть запрос REST API, который мне нужно сделать, но если я сделаю его от клиента, он будет заблокирован CORS. Поэтому я использовал express-http-proxy, чтобы попытаться обойти это; Я отправляю свой запрос на него и перенаправляет сервер, на котором есть конечная точка REST API. Это совокупность моего кода сервера, который работает с node server.js:express-http-proxy по-прежнему блокируется политикой CORS

var express = require('express'); 
var proxy = require('express-http-proxy'); 

var server = express(); 
server.use('/', express.static(__dirname + '/')); 
server.listen(8080); 
server.use('/rest/api/2/search', proxy('restserver:8877')); 
console.log("Server listening on localhost:8080"); 

Когда доступ restserver: 8877/отдых/API/2/поиска в браузере он возвращает кучу JSON как поиск «по умолчанию».

На стороне клиента, у меня есть железо-Аякса делает этот запрос:

<iron-ajax 
      id="getBugs" 
      url="/rest/api/2/search" 
      params='' 
      on-response="handleResponse" 
      debounce-duration="300"> 
     </iron-ajax> 

И в разделе сценария, я использую this.$.getBugs.generateRequest() в функции ready, чтобы отправить запрос. Поэтому я загружаю это, ожидая, что запрос не будет заблокирован CORS, поскольку ... он проксируется сервером. Вместо этого, Chrome DevTools дает мне это:

XMLHttpRequest cannot load http://restserver:8877/secure/MyJiraHome.jspa. Redirect from 'http://restserver:8877/secure/MyJiraHome.jspa' to 'http://restserver:8877/secure/Dashboard.jspa' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access. 

Я не понимаю, почему это дает мне эти URL-адреса, так как я никогда не ссылаться на них, и почему он блокирует из-за CORS, так как это происходит с сервера, а не клиент, что является целым рядом с прокси-сервером.

ответ

0

Сервер, вероятно, возвращает перенаправление 302, которое неправильно обрабатывается в используемом промежуточном программном обеспечении.

Узнайте больше, как работает редирект: https://en.wikipedia.org/wiki/HTTP_location

Вы можете изменить заголовок Location ответа для преодоления проблемы CORS или вы можете попробовать:

var proxy = require('http-proxy-middleware'); 

var restServerProxy = proxy({target: 'http://restserver:8877', autoRewrite: true}); 

server.use('/rest/api/2/search', restServerProxy); 

Приведенный выше пример должен обрабатывать редиректы автоматически.

0

Альтернативным решением было бы использовать http-proxy-middleware как упомянуто @chimurai.

Если вы хотите, чтобы прокси-сервер HTTPS избежать CORS:

const proxy = require('http-proxy-middleware'); 

app.use('/proxy', proxy({ 
    pathRewrite: { 
     '^/proxy/': '/' 
    }, 
    target: 'https://server.com', 
    secure: false 
})); 

Здесь безопасно: ложные необходимо установить, чтобы избежать UNABLE_TO_VERIFY_LEAF_SIGNATURE ошибку.

Смежные вопросы