从代理后面运行的网站访问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
谢谢