2013-12-02 3 views
9

Я разрабатываю веб-сайт с использованием ember и express over node. Он работает на сервере, скажем: SERVER_1.Доступ к веб-сервисам с веб-сайта, который работает за прокси

У меня есть несколько веб-сервисов, работающих на другом сервере, скажем: SERVER_2.

То есть:

сайт в SERVER_1 и веб-сервисов, доступных в Server_2

SERVER_1 находится за прокси-сервером. И я пытаюсь получить доступ к веб-сервисы от SERVER_1:

SERVER_1 =====[PROXY]===> SERVER_2 

Когда я делаю AJAX веб-сервиса звонки от SERVER_1, я получаю:

NetworkError: 500 Internal Server Error 

Однако, я могу получить значения успешно через браузер. Только через код AJAX я извлекаю Ошибка сети 500.

Кроме того, для тестирования, я удалил мою Настройку прокси-сервера:

SERVER_1 =====> SERVER_2 

, и я был в состоянии получить доступ ко всей этой веб-службе успешно и с помощью AJAX коды и браузера.

Если у меня есть прокси-сервер между ними:

SERVER_1 =====[PROXY]===> SERVER_2 

я получаю - NetworkError: 500 Внутренняя ошибка сервера

Я хотел бы знать процедуры для доступа к третьей стороне веб-сервисы с веб-сайта, который работает за прокси-сервером?

Дополнительная информация:

Уже исправить междоменное проблему доступа к веб-сервис (веб-сайт работает на одном сервере и веб-сервисы, работающие в некоторых других разных серверах с разными портами), я использую HTTP-прокси НПМ и мой код выглядит следующим образом:

var express = require('express'); 
var routes = require('./routes'); 
var http = require('http'); 
var path = require('path'); 
var httpProxy = require('http-proxy'); 
var endpoint = { 
    host: 'IP_ADDRESS_WHERE_MY_WEBSERVICES_RUN', 
    port: 80, 
    prefix: '/api' 
} 

var proxy = new httpProxy.RoutingProxy(); 
var app = express(); 

app.set('port', process.env.PORT || 3000); 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'ejs'); 
app.use(express.favicon()); 
app.use(express.logger('dev')); 
app.use(express.methodOverride()); 
app.use(express.cookieParser('xxxxx')); 
app.use(express.session()); 
app.use(app.router); 
app.use(express.static(path.join(__dirname, 'public'))); 
app.use(function(req, res) { 
    if (req.url.indexOf(endpoint.prefix) === 0) { 
     proxy.proxyRequest(req, res, endpoint); 
    } 
}); 
app.use(express.bodyParser()); 

if ('development' == app.get('env')) { 
    app.use(express.errorHandler()); 
} 
app.get('/', routes.index); 

http.createServer(app).listen(app.get('port'), function(){ 
    console.log('Express server listening on port ' + app.get('port')); 
}); 

Мой AJAX вызов:

$.ajax({ 
      type: 'GET', 
      async: false, 
      url: 'API_URL', 
      success: function (data) { 
       alert('success'); 
      }, 
      failure: function(error){ 
       alert('error'); 
      } 
     }); 

Уже я использую http-proxy для обработки запроса всего URL-адреса.

Как настроить IP-адрес и порт моего прокси-сервера в приведенном выше коде, чтобы я мог получить доступ ко всем этим веб-службам успешно? Или есть какой-то способ настроить мои прокси-конфигурации в вызове AJAX?

Может ли кто-нибудь направить меня?

Спасибо

+0

Как об использовании [прямой прокси] (HTTPS: //github.com/nodejitsu/node-http-proxy#proxy-requests-with-an-additional-forward-proxy)? –

+0

Многие объекты в Node.js не выбрасывают ошибку, а вместо этого вызывают события 'error'. Просто слушайте событие ошибки и 'console.log', чтобы мы знали, что происходит. –

+0

Я пробовал с прокси-сервером. Однако это мне не помогло. Можете ли вы направить меня? –

ответ

3

Обычно вам нужно сделать оба из них:

НОЙ конфигурации набор прокси-вашего-прокси-адрес: порт НПХ конфигурационный набор реестра «http://registry.npmjs.org/»

+0

Я пробовал оба эти ... однако, это не помогло. Как я уже говорил, я могу установить все пакеты npm (что означает, что мой узел-сервер может подключаться к Интернету и загружать все пакеты). Однако, если я звоню тем сторонним веб-службам за своим корпоративным прокси-сервером, я получаю такую ​​ошибку. Поэтому я чувствую, что у меня должен быть код в настройках узла веб-узла (как с моим прокси-сервером, так и с портом). Можете ли вы, пожалуйста, направить меня еще дальше? –

+0

Если все остальное не удается, вы всегда можете настроить хост в целом на использование прокси-сервера. Это Windows или Linux-хост? Сначала вы должны убедиться, что прокси-сервер - это ваша проблема с первым входом на хост узла (узла) и использование traceroute на адрес веб-службы, которую вы пытаетесь использовать, должны показать вам, где пакеты останавливаются в вашей сети. wget --proxy-user = USERNAME --proxy-password = PASSWORD http://path.to.domain.com/some.html. Позволит вам напрямую попробовать и получить доступ к конечной точке из прокси. Когда –

+0

Спасибо за ответ Даррен Уайт. Я отредактировал мой вопрос. Можете ли вы представить свои мысли по этому поводу? –

2

В общем я предлагаю вы пытаетесь решить эту проблему, выделив проблему больше.

Есть еще слишком много открытых переменных. Ваш запрос действительно путешествует через прокси-сервер или он умирает в прокси-сервере? Если он покидает прокси-сервер - почему бы не создать просто [Proxy] -> Server2?

У меня возникает ощущение, что проблема находится где-то в (отсутствующих) заголовках, чтобы прокси-сервер переходил. Например, это «NetworkError: 500» - создается PHP-серверами, когда процесс умирает при отправке вывода. Может быть, вы запускаете ошибку в Server2, потому что ваш прокси-выход отличается от Server1-output?

Просто сравните выходные данные прокси-сервера с выходом Server1 (nc - твой друг). Надеюсь это поможет.

+0

Позвольте мне попробовать и обновить вас. Спасибо CFrei –

+0

Я чувствую, что мой сервер [PROXY] блокирует все вызовы API (эти запросы API не пересекают прокси-сервер). Я подтвердил это через журнал доступа к кальмару моего прокси-сервера. Сначала я получил доступ к API из браузера (путем вызова URL-адреса API). Я получил ответ успешно, и для этого API-запроса была введена запись в squid. Теперь я попробовал один и тот же вызов API через мой код AJAX, теперь нет ответа и нет записи в журналах кальмаров. Я чувствую, что мой прокси-сервер squid блокирует или не разрешает эти вызовы api. Можете ли вы, пожалуйста, направить меня дальше? –

+1

Хмммм ... Хорошая новость кажется, что проблема полностью под вашим контролем. См. Код, в котором вы вызываете прокси. Я не знаю этого модуля, но вы не возвращаете никакого значения и не передаете обратный вызов. Может, там что-то не так? Бедный человек отладчик: console.log, возможно, помогает? – CFrei

2

Если бы Sun Tzu был в этой теме, он бы сказал вам, что правильная стратегия не была бы в этом положении в первую очередь. Поскольку порт 443 обычно открыт во всех корпоративных сетях, чтобы https-трафик рассматривал возможность создания сервера с использованием (чье-то) облачного предложения где-то и ssh'ing к нему на порту 443. Вы даже можете использовать эту технику для создания своего собственного прокси для целей развития (см. squidd) - таким образом, по крайней мере, вы могли бы хотя бы просмотреть журналы прокси.

Вы пытаетесь решить сразу две проблемы - один из них - это сетевой код, который вы пишете. Выполнение этого будет означать, что вам нужно решить только одно за раз, и ни одно из них не блокирует ваш прогресс.

0

Я обнаружил, что мой URL-адрес, связанный с прокси-маршрутизатором, вызывает проблемы здесь. Мой прокси-сервер блокирует все эти URL-адреса.

Как я не могу найти ответ на маршрутизацией прокси вызовов API позади прокси-сервера, я сделал временное решение патч следующим образом:

Удален существующий код прокси-маршрутизации от сервера приложений (которые я использовал, прежде чем решить междоменный AJAX вопрос):

var express = require('express'); 
var routes = require('./routes'); 
var http = require('http'); 
var path = require('path'); 

var app = express(); 

app.set('port', process.env.PORT || 3000); 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'ejs'); 
app.use(express.favicon()); 
app.use(express.logger('dev')); 
app.use(express.methodOverride()); 
app.use(express.cookieParser('xxxxx')); 
app.use(express.session()); 
app.use(app.router); 
app.use(express.static(path.join(__dirname, 'public'))); 
app.use(express.bodyParser()); 

if ('development' == app.get('env')) { 
    app.use(express.errorHandler()); 
} 
app.get('/', routes.index); 

http.createServer(app).listen(app.get('port'), function(){ 
    console.log('Express server listening on port ' + app.get('port')); 
}); 

Теперь мой AJAX вызова будет:

 $.ajax({ 
      type: 'GET', 
      async: false, 
      url: 'FULL_API_URL', 
      success: function (data) { 
       alert('success'); 
      }, 
      failure: function(error){ 
       alert('error'); 
      } 
     }); 

Для обработки вопроса междоменного в AJAX звонков, я сделал серв er, добавив заголовок Access-Control-Allow-Origin во всех ответах API с сервера.

Некоторые дополнительная информация: Если кто-то борется с выпуском междоменном в AJAX требует IE8 и IE9 браузеры, см: https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest

Спасибо