如何使用 Grunt 或 Node 服务器基于 User-Agent(移动和桌面)重定向请求/代理?
How to redirect requests / proxy based on User-Agent (mobile and desktop) using Grunt or Node server?
我正在使用 Grunt 及其代理库 grunt-connect-proxy。我为我网站的桌面版和移动版设置了两台服务器(两者都有独立的资产等,因此是分离的)。这两个站点都托管在 0.0.0.0 上,但端口不同(9000 和 10000)。
我如何根据 User-Agent header 将请求代理到两个不同的服务器(这会告诉我它是移动设备还是桌面设备用户)?我可以使用 NodeJS 中的其他解决方案吗?
我最终编写了一个 NodeJS 服务器,它使用 http-proxy 和 mobile-detect 包来代理请求。
var servers = {
desktopClientFrontend: 'http://0.0.0.0:10000',
mobileClientFrontend: 'http://0.0.0.0:9000',
railsApiBackend: 'http://0.0.0.0:11000'
};
var http = require('http'),
url = require('url'),
httpProxy = require('http-proxy'),
MobileDetect = require('mobile-detect');
var proxy = httpProxy.createProxyServer({});
proxy.on('error', function (err, req, res) {
res.writeHead(500, {
'Content-Type': 'text/plain'
});
res.end('Something went wrong. And we are reporting a custom error message.');
});
var server = http.createServer(function(req, res) {
if(url.parse(req.url).pathname.match(/^\/api\//)) {
proxy.web(req, res, { target: servers.railsApiBackend });
} else {
var mobileDetect = new MobileDetect(req.headers['user-agent']);
if(mobileDetect.mobile()) {
proxy.web(req, res, { target: servers.mobileClientFrontend });
} else {
proxy.web(req, res, { target: servers.desktopClientFrontend });
}
}
});
server.listen(80);
我正在使用 Grunt 及其代理库 grunt-connect-proxy。我为我网站的桌面版和移动版设置了两台服务器(两者都有独立的资产等,因此是分离的)。这两个站点都托管在 0.0.0.0 上,但端口不同(9000 和 10000)。
我如何根据 User-Agent header 将请求代理到两个不同的服务器(这会告诉我它是移动设备还是桌面设备用户)?我可以使用 NodeJS 中的其他解决方案吗?
我最终编写了一个 NodeJS 服务器,它使用 http-proxy 和 mobile-detect 包来代理请求。
var servers = {
desktopClientFrontend: 'http://0.0.0.0:10000',
mobileClientFrontend: 'http://0.0.0.0:9000',
railsApiBackend: 'http://0.0.0.0:11000'
};
var http = require('http'),
url = require('url'),
httpProxy = require('http-proxy'),
MobileDetect = require('mobile-detect');
var proxy = httpProxy.createProxyServer({});
proxy.on('error', function (err, req, res) {
res.writeHead(500, {
'Content-Type': 'text/plain'
});
res.end('Something went wrong. And we are reporting a custom error message.');
});
var server = http.createServer(function(req, res) {
if(url.parse(req.url).pathname.match(/^\/api\//)) {
proxy.web(req, res, { target: servers.railsApiBackend });
} else {
var mobileDetect = new MobileDetect(req.headers['user-agent']);
if(mobileDetect.mobile()) {
proxy.web(req, res, { target: servers.mobileClientFrontend });
} else {
proxy.web(req, res, { target: servers.desktopClientFrontend });
}
}
});
server.listen(80);