node.js - 如何使用 Grunt 或 Node 服务器基于用户代理(移动和桌面)重定向请求/代理?

标签 node.js proxy gruntjs user-agent grunt-contrib-connect

我正在使用 Grunt 及其代理库 grunt-connect-proxy .我为我网站的桌面版和移动版设置了两台服务器(两者都有独立的 Assets 等,因此是分离的)。这两个站点都托管在 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);

关于node.js - 如何使用 Grunt 或 Node 服务器基于用户代理(移动和桌面)重定向请求/代理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28203750/

相关文章:

node.js - Express 中的静态文件地址

javascript - 创建文件路径的嵌套对象

android - 不要在 android 9 pie 上使用代理

gruntjs - 如何让 grunt.file.readJSON() 等待另一个任务生成文件

linux - 在端口 80 上使用 pm2 启动应用程序时,应用程序生成 "Error: listen EACCES"?

javascript - 使用ajax提交表单时出现错误

java - 如何让 Spring Security 在跨多个域的负载均衡器后面工作?

Node.js HTTPS 代理服务器不工作

node.js - Grunt + Compass 不创建 CSS 文件

gruntjs - npm 模块 "grunt-contrib-imagemin"未找到,是否已安装?