从代理服务器后面的网站访问Web服务

时间:2013-12-02 07:56:40

标签: node.js ember.js proxy node-http-proxy webproxy

我正在使用ember和express over node设计一个网站。它在服务器中运行,例如:SERVER_1。

我在另一台服务器上运行的web服务很少,比如说:SERVER_2。

那是:

SERVER_1中的网站和SERVER_2中的网络服务

SERVER_1位于代理服务器后面。我正在尝试从SERVER_1访问webservices:

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

当我从SERVER_1进行AJAX webservice调用时,我收到:

NetworkError: 500 Internal Server Error

但是,我可以通过浏览器成功检索值。仅通过AJAX代码,我正在检索网络500错误

同样为了测试,我删除了我的代理服务器设置:

SERVER_1 =====> SERVER_2

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

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

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

我收到了 - NetworkError:500内部服务器错误

我想知道从代理服务器后面运行的网站访问第三方网络服务的程序吗?

其他信息:

已经修复跨域Web服务访问问题(在一台服务器上运行的网站和在不同端口的其他一些服务器上运行的webservices),我正在使用 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来处理所有网址的请求。

如何在上面的代码中配置我的代理服务器的IP地址和端口,以便我可以成功访问所有这些Web服务?或者是否有某种方法可以在AJAX调用中使用我的代理配置?

有人可以指导我吗?

谢谢

4 个答案:

答案 0 :(得分:3)

通常你需要同时做这两件事:

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

答案 1 :(得分:2)

一般情况下,我建议您尝试通过更多地隔离问题来解决此问题。

开放变量仍然太多。您的请求是真的通过代理进行还是在代理中死亡?如果它离开代理 - 为什么不只构建[代理] - >服务器2?

我有一种直觉,认为问题出现在代理转发的(缺失)标题中。这个“NetworkError:500”是 - 例如 - 当进程在发送输出时死亡时由PHP服务器创建。也许您在Server2中触发了一个错误,因为您的代理输出与Server1输出不同?

只需将Proxy的输出与Server1的输出进行比较(nc是您的朋友)。希望这会有所帮助。

答案 2 :(得分:2)

如果孙子在这个问题上,他会告诉你正确的策略不会首先处于这个位置。由于端口443通常在所有公司网络上打开,为了允许https流量考虑使用某人在某处创建服务器并在端口443上使用ssh。它甚至可以使用此技术为开发目的创建自己的代理(参见squidd) - 至少你至少可以看到代理日志。

您正在尝试一次解决两个问题 - 一个是网络,另一个是您正在编写的代码。这样做意味着您只需要一次解决一个问题,也不会阻止您的进度。

答案 3 :(得分:0)

我发现,我的代理路由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调用中的跨域问题,我通过在来自服务器的所有API响应中添加“Access-Control-Allow-Origin”标头来进行服务器端修复。

其他一些信息: 如果有人在AJAX调用IE8和IE9浏览器时遇到跨域问题,请参考: https://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest

谢谢