从代理后面运行的网站访问web服务

我正在devise一个使用烬的网站,并在节点上expression。 它运行在服务器上,说:SERVER_1。

我有几个webservices运行在另一台服务器,说:SERVER_2。

那是:

SERVER_1中的网站和SERVER_2中提供的webservices

SERVER_1位于代理服务器的后面。 我试图从SERVER_1访问webservices:

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

当我从SERVER_1进行AJAX web服务调用时,我收到:

 NetworkError: 500 Internal Server Error 

但是,我能够通过浏览器成功检索值。 只有通过AJAX代码,我正在检索networking500错误

另外为了testing,我删除了我的代理服务器设置:

 SERVER_1 =====> SERVER_2 

我可以通过AJAX代码和浏览器成功访问所有这些Web服务。

如果我有他们之间的代理服务器:

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

我越来越 – NetworkError:500内部服务器错误

我想知道从代理服务器上运行的网站访问第三方Web服务的过程吗?

附加信息:

已经修复跨域Web服务访问问题(网站运行在一个服务器和Web服务运行在一些其他不同的服务器与不同的端口),我使用HTTP代理 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的请求。

如何在上面的代码中configuration我的代理服务器的IP地址和端口,以便我可以成功访问所有这些Web服务? 或者有什么办法让我的代理configuration在AJAX调用?

任何人都可以请指导我?

谢谢

通常你需要做这两个:

npmconfiguration设置代理你的代理地址:端口npmconfiguration设置registry“ http://registry.npmjs.org/

一般来说,我build议你尝试通过更多的隔离问题来解决这个问题。

仍然有太多的开放variables。 您的请求是否真的在代理中传播,或者在代理中死亡? 如果它离开代理 – 为什么不build立只是[代理] – >服务器2?

我有一个直觉认为这个问题是在代理转发(丢失)标题的某处。 例如,这个“NetworkError:500”是由PHP服务器在发送输出时死亡的情况下创build的。 也许你在Server2中触发了一个错误,因为你的代理输出和Server1的输出是不同的?

只需将Proxy的输出与Server1的输出进行比较( nc是你的朋友)。 希望这可以帮助。

如果孙子在这个线上,他会告诉你正确的策略不会在这个位置摆在首位。 由于端口443通常在所有企业networking上都是开放的,为了允许httpsstream量,可以考虑使用(某人)提供的云端服务器在端口443上创build服务器。您甚至可以使用这种技术为开发目的创build自己的代理(见squidd) – 至less你可以看到代理日志。

你正试图同时解决两个问题 – 一个是networking,另一个是你正在编写的代码。 这样做意味着你只需要一次解决一个问题,而不是阻止你的进展。

我发现,我的代理路由的API URL在这里造成麻烦。 我的代理服务器阻止所有这个路由的URL。

由于我无法find代理服务器后面路由的代理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调用中的跨域问题,我通过在来自服务器的所有API响应中添加了“Access-Control-Allow-Origin”头来做了服务器端修复。

一些额外的信息:如果任何人在AJAX中的跨域问题挣扎呼吁IE8和IE9浏览器,请参阅: https : //github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest

谢谢