在expressjs中检测IE,但无法获取静态文件

时间:2013-05-22 05:27:20

标签: node.js express

我试图通过使用expressjs来检测IE,代码肯定会将我重定向到错误页面。

但问题是它不会渲染css文件并在我的文件夹中获取图像文件。

我认为问题是在设置静态路径之前,expressjs会重定向到error_page

所以我把app.all('*', ieRedirecter);放在

之后
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.static(__dirname + '/uploads'));

问题仍然存在......有人可以帮助我,谢谢!

我的设置

function ieRedirecter(req, res, next) {
  if(req.headers['user-agent'].indexOf("MSIE") >= 0) {
    var myNav = req.headers['user-agent'];
    var IEbrowser = parseInt(myNav.split('MSIE')[1]) 
    if(IEbrowser < 9) {
      res.render('error/browser_error', {title : 'not supporting your browser'})
    } else {
      next();
    }
  } else {
    next();
  }
};

app.configure(function(){
    app.set('port', process.env.PORT || 3000);
    ...
    ...
    ...
    app.use(app.router);

    app.use(express.static(path.join(__dirname, 'public')));
    app.use(express.static(__dirname + '/uploads'));

    app.all('*', ieRedirecter);
})

1 个答案:

答案 0 :(得分:2)

此订单不起作用:

app.use(app.router);

app.use(express.static(path.join(__dirname, 'public')));
app.use(express.static(__dirname + '/uploads'));

app.all('*', ieRedirecter);

app.router是处理所有路由请求的中间件,包括app.all(),即使您在其他中间件之后声明该路由(有趣的事实:在任何时候您声明路由 - 使用{{ 1}} - app.{get,post,all,...}中间件自动插入中间件链中。

如果可能,最简单的解决方案是将静态和IE中间件移到路由之前(但我意识到这可能会导致应用程序设置出现问题):

app.router

另一种解决方案是通过查看// static middleware first... app.use(express.static(path.join(__dirname, 'public'))); app.use(express.static(__dirname + '/uploads')) // ...followed by the IE check app.use(ieRedirecter); // ...followed by your routes app.get('/', ...); ... 过滤掉ieRedirecter中间件中静态资源的请求,但这假设您可以轻松识别这些请求(例如,如果它们以{{1}开头}或req.path)。