快递 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 。
我知道它有点令人困惑,但事实就是如此,我不能将它从公共目录中删除,因为它不会再看到公共/脚本,我不能放弃它因为我无法授权(所有授权都在公共/剧本)
如果有更聪明的方法,请随时告诉我:)
答案 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');
...