Доступ к веб-сервисам с веб-сайта, работающего за прокси-сервером

Я разрабатываю веб-сайт, используя ember и экспресс через 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 Internal Server Error

Мне хотелось бы узнать, как получить доступ к сторонним веб-сервисам с веб-сайта, работающего за прокси-сервером?

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

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

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?

Кто-нибудь может мне помочь?

Спасибо


person Community    schedule 02.12.2013    source источник
comment
Многие объекты в Node.js не выдают ошибку, а вместо этого генерируют события error. Просто прослушайте событие ошибки и console.log его, чтобы мы знали, что происходит.   -  person Paul Mougel    schedule 02.12.2013
comment
Пробовал через прямой прокси. Однако мне это не помогло. Не могли бы вы направить меня?   -  person    schedule 03.01.2014
comment
Настройка конфигурации NPM не имеет ничего общего с вашей проблемой. Насколько я понял, у вас есть локальный сервер S1, который пытается получить доступ к внешним URL-адресам S2 за прокси: [ S1 ] ==== [ proxy ] ===> [ S2 ] С библиотекой вы используете для запроса S2 от С1? Если вы не используете эти веб-службы REST непосредственно из браузера в Ajax?   -  person Feugy    schedule 22.01.2014
comment
Спасибо за ваш ответ Feugy. Я использую библиотеки http и http-proxy в S1 для доступа к веб-сервисам (которые работают в S2). И вы правы, S1 находится за прокси-сервером. Если я удалю этот прокси-сервер, я смогу успешно получить доступ к веб-сервисам. коды представлены в разделе «Дополнительная информация». Моя проблема в том, что когда у меня есть прокси-сервер. У меня возникают проблемы с доступом к веб-сервисам.   -  person    schedule 22.01.2014
comment
Feugy, я также отредактировал свой вопрос. Надеюсь, теперь все ясно. Извиняюсь!   -  person    schedule 22.01.2014


Ответы (4)


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

npm config set proxy your-proxy-address:port npm config setRegistry "http://registry.npmjs.org/"

person Darren White    schedule 18.01.2014
comment
Я пробовал оба эти .. однако, это не помогло. Как я уже говорил, я могу установить все пакеты npm (это означает, что мой сервер узлов может подключаться к Интернету и загружать все пакеты). Однако, если я вызываю эти сторонние веб-сервисы за своим корпоративным прокси, я получаю такую ​​ошибку. Поэтому я чувствую, что у меня должен быть некоторый код в настройках узла моего веб-сайта (как с моим IP-адресом прокси-сервера, так и с портом). Не могли бы вы помочь мне в дальнейшем? - person ; 20.01.2014
comment
Спасибо за ответ, Даррен Уайт. Я отредактировал свой вопрос. Не могли бы вы поделиться своими мыслями по этому поводу? - person ; 22.01.2014
comment
Вам нужно выполнить сетевые команды, которые я предложил. Вы не работаете в песочнице — как предлагали другие, вам нужно изолировать свою проблему. Ваш браузер явно работает с настройкой прокси. Есть ли что-нибудь еще на вашем хосте? Если ваш хост находится за прокси-сервером, как вы обновляете или устанавливаете исправления из Интернета? Эти приложения также правильно используют прокси? - person Darren White; 26.01.2014
comment
Спасибо за ответ Даррен. Это действительно направляет меня. Я чувствую, что только мой сервер [PROXY] блокирует все вызовы API (запросы не проходят через прокси-сервер). Я нашел это по следующему сценарию: изначально между клиентом и сервером нет прокси-сервера. Я смог успешно получить доступ к API. Когда я ввожу прокси-сервер между клиентом и сервером, я получаю эту ошибку. Следовательно, я чувствую, что прокси-сервер блокирует мой запрос API. Я чувствую, что мне нужно как-то настроить IP-адрес и порт моего прокси-сервера в клиентском коде для доступа к API. - person ; 27.01.2014
comment
Кроме того, я подтвердил это через журнал доступа squid моего прокси-сервера. Сначала я получил доступ к API из браузера (вызвав URL-адрес API). Я успешно получил ответ, и в журнале squid была запись об этом вызове API. Теперь я попробовал тот же вызов API через свой код AJAX, теперь нет ответа и нет записи в журналах squid. Я чувствую, что мой прокси-сервер squid блокирует или не разрешает эти вызовы API. Не могли бы вы направить меня дальше? - person ; 27.01.2014

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

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

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

Просто сравните вывод прокси с выводом сервера 1 (nc — ваш друг). Надеюсь это поможет.

person CFrei    schedule 24.01.2014
comment
Я чувствую, что мой сервер [PROXY] блокирует все вызовы API (эти запросы API не проходят через прокси-сервер). Я подтвердил это через журнал доступа squid моего прокси-сервера. Сначала я получил доступ к API из браузера (вызвав URL-адрес API). Я успешно получил ответ, и в журнале squid была запись об этом вызове API. Теперь я попробовал тот же вызов API через свой код AJAX, теперь нет ответа и нет записи в журналах squid. Я чувствую, что мой прокси-сервер squid блокирует или не разрешает эти вызовы API. Не могли бы вы направить меня дальше? - person ; 27.01.2014
comment
Хмммм... Хорошие новости, кажется, проблема полностью под вашим контролем. Смотрите свой код, где вы вызываете прокси. Я не знаю этот модуль, но вы не возвращаете никакого значения и не передаете обратный вызов. Может там что-то не так? Бедняги отладчик: console.log может помочь? - person CFrei; 27.01.2014
comment
Извините, я слишком новичок в этом модуле node-http-proxy. Уже для устранения проблемы междоменного AJAX я использую RoutingProxy (пожалуйста, просмотрите мой код, найденный в разделе «Дополнительная информация». Теперь я чувствую, что мне нужно каким-то образом включить IP-адрес и порт моего прокси-сервера, чтобы иметь успешный доступ к API из моего от клиента к серверу. Можете ли вы сказать, где отлаживать мой код? - person ; 27.01.2014
comment
Отлично - опубликуйте свою конфигурацию squid :) - person Darren White; 27.01.2014
comment
Возможно, вы захотите полностью удалить все узлы, используя настройку прокси для ВСЕГО ХОСТА — что-то вроде export http_proxy=server-ip: порт. Затем вы можете использовать wget или telnet для службы, которую вы используете, чтобы подтвердить, что прокси-сервер блокируется, а не что-то в вашем приложении неправильно настроено. - person Darren White; 27.01.2014
comment
Извините, на самом деле у меня нет доступа/контроля для просмотра конфигураций squid в моем офисе :( Можем ли мы обработать это на сервере узлов или в ExpressJS? Так что мой вызов AJAX/запрос API содержит IP-адрес моего прокси-сервера и конфигурацию порта, и они пересекаются этот прокси-сервер? - person ; 27.01.2014

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

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

person Darren White    schedule 26.01.2014

Я обнаружил, что мой URL-адрес API с прокси-маршрутизацией вызывает здесь проблемы. Мой прокси-сервер блокирует все эти маршрутизируемые 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, я внес исправление на стороне сервера, добавив заголовок «Access-Control-Allow-Origin» во все ответы API с сервера.

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

Спасибо

person Community    schedule 30.01.2014