Node Express Server无法正确处理http重定向

时间:2016-01-12 19:39:31

标签: node.js redirect express server

我尝试使用2台Express服务器的组合将用户从http重定向到https,并将用于www的请求重定向到非www,因为证书需要非www。第一个问题是,用户访问https://www.example.com他们获得了ERR_CONNECTION_REFUSED。第二个问题,用户访问http://www.example.com存在DNS错误。用户只能成功访问http://example.com(并重定向)和https://example.com。我已经尝试了一些解决方案,但很多Express的例子似乎已经过时了,需要改变什么才能涵盖上述两个用例?

  // Create Express Server
  server = express();
  httpServer = express();

  // Redirect http to https
  httpServer.set('port', 80);

  httpServer.get("*", function (req, res, next) {
      res.redirect("https://" + req.headers.host + "/" + req.path);
  });

  http.createServer(httpServer).listen(80);


  server.set('trust proxy', true);

  // Add server static middleware
  server.use( st(options.prod.st) );

  server.use(function (req, res, next) {
    var str = "www.";
    if (req.headers.host.indexOf(str) === 0) {
      res.redirect(301, req.protocol + "://" + req.headers.host.slice(str.length) + req.originalUrl);
    } else {
      next();
    }
  });

  // Fallback to /index.html
  server.use(fallback(prodRoot));

  // Start Server
  https.createServer(creds, server).listen(options.prod.port);

1 个答案:

答案 0 :(得分:0)

为www添加NS记录后,大多数问题都已解决。谢谢@Fella的建议。更正后的代码如下。如果用户登陆https://www.example.com,我最终还必须修复问题我需要添加CORS策略以防止Web应用程序中的某些XMLHttpRequests发出混合内容警告。我还删除了从www到非www的重定向,修复NS记录后没有必要。

 // Create Connect Server
  server = express();
  httpServer = express();

  // Redirect http to https

  httpServer.get('*', function (req, res, next) {
      res.redirect(301, 'https://' + req.headers.host + req.path);
  });

  http.createServer(httpServer).listen(80);

  // Add serve static middleware
  server.use( st(options.prod.st) );

  // Implement CORS policy
  server.use(function(req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
    next();
  });

  // Fallback to /index.html
  server.use(fallback(prodRoot));

  // Start Server
  https.createServer(creds, server).listen(443);