从express中的静态文件中排除子目录

时间:2015-02-23 18:26:23

标签: node.js express

快递 4.8.5中是否有任何方法可以排除子目录与快速静态中间件。

例如,如果我有:

app.use(express.static(__dirname + 'public'));

我的公共目录是这样的:

- public  
   - css
   - images
   - scripts
   - index.html
   - exclude_me
        - scripts
        - views
        - index.html

所以我需要排除最后一个子目录,当用户执行时:

GET /exclude_me

它应该调用我的路线而不是自动返回目录。

我不能将其从公共目录中删除,因为它取决于其中的内容,因为公共目录是角度应用程序而 exclude_me 是另一个从中提取脚本的角度应用程序来自 / public / scripts / exclude_me / scripts AND

我知道它有点令人困惑,但事实就是如此,我不能将它从公共目录中删除,因为它不会再看到公共/脚本,我不能放弃它因为我无法授权(所有授权都在公共/剧本

如果有更聪明的方法,请随时告诉我:)

4 个答案:

答案 0 :(得分:16)

您可以添加自己的中间件。这是我为排除某些文件夹所做的工作:

app.use('/public', (req, res, next) => {
  if (env !== 'development') {
    var result = req.url.match(/^\/js\/(maps|src)\/.+\.js$/)
    if (result) {
      return res.status(403).end('403 Forbidden')
    }
  }
  next()
})
app.use('/public', express.static(path.join(__dirname, '/public')))

答案 1 :(得分:6)

可以通过将正则表达式添加到use方法的第一个可选参数中来实现。

根据Express 4.x API path documentation

示例,我不想访问secure文件夹中的public文件夹:

var express = require('express');
var app = express();

app.use([/^\/public\/secure($|\/)/, '/public'], __dirname + 'public');

这将允许您访问所有文件,但不能访问secure文件夹中的文件。

您也可以使用它来限制文件扩展名,以.js.map结尾的示例文件:

app.use([/(.*)\.js\.map$/, '/public'], __dirname + 'public');

您还可以添加多个规则,例如,此示例中,secure文件夹和以.js.map结尾的文件将从静态文件夹中忽略:

app.use([/^\/public\/secure($|\/)/, /(.*)\.js\.map$/, '/public'], __dirname + 'public');

答案 2 :(得分:4)

我有一个类似的问题,这可能是你正在寻找的答案。给出以下目录:

public
   css/
   images/
   secure/
   index.html

我想要的Express Middleware堆栈是这样的:

1. Static files (except the `secure/` directory)
2. Logging
3. Authentication
4. `secure/` static files

以下是我如何解决它:

var express = require('express');

var path = require('path');
var app = express();

// path.join here makes it work cross platform with Windows / Linux / etc
var statics = express.static(path.join(__dirname, 'public'));

function secureStatic(secure) {
  return function (req, res, next) {
    if (/^\/secure/.test(req.path) === !!secure) return statics(req, res, next);

    return next();
  };
}

// add public files
app.use(secureStatic());
app.use(logging());
app.use(authentication());

// add secured files
app.use(secureStatic(true));

这仅在未经身份验证时提供公共文件,并且仅在身份验证后提供安全文件。

答案 3 :(得分:0)

上述大多数解决方案都是使用中间件。

但是,有一种更简单的方法可以解决这个问题。

不要直接使用dir public提供静态声明,而不是仅使用虚拟路径前缀为dir提供服务。

您可以像下面这样投放

var express = require('express');
var app = express();

app.use('/public', __dirname + 'css');
app.use('/public', __dirname + 'images');
...