从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
它应该调用我的路线,而不是自动返回目录。
我不能从公共目录中删除它,因为它依赖于它里面的东西,因为公共目录是angular度应用程序,而exclude_me是另一个从/ exclude_me / scripts 和 / public / scripts获取脚本的angular度应用程序。
我知道这是一点混淆,但它是这样的,我不能只是从公共目录删除它,因为它不会再看到公共/脚本需要,我不能离开它,因为我不能授权它(所有的授权是在公共/脚本 )
如果有一些更聪明的方法来做到这一点,请随时让我知道:)
你可以添加你自己的中间件。 这是我做了什么来排除一些文件夹:
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')))
通过将正则expression式添加到use
方法的第一个可选参数中是可能的。
根据Express 4.x APIpath文档 。
例如,我不想在public
文件夹中访问我的secure
文件夹:
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');
我有一个类似的问题,这可能是你正在寻找的答案。 给定以下目录:
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));
这只会在未经身份validation的情况下提供公共文件,并仅在身份validation后提供安全文件。
上面的大多数解决scheme都是使用中间件。
但是,解决这个问题有一个更简单的方法。
不要直接使用dir public
来提供静态的assert,而只需要为虚拟path前缀提供服务。
你可以像下面的服务
var express = require('express'); var app = express(); app.use('/public', __dirname + 'css'); app.use('/public', __dirname + 'images'); ...
- Node.js从MongoDB获取请求返回undefined
- 如何通过node.js与socket.io获取请求数据并expression?
- ReferenceError:t没有定义
- express:保持所有DRY创build一个mongoose连接模块(使用新的createConnection方法)
- 如何在express.js中使用服务器发送的事件
- 未处理的拒绝MongoError:无法连接到MongoDB中的服务器
- 如何更新房间内所有客户端的套接字对象? (socket.io)
- socket.io + redis + expressjs集群 – 在expressjs请求中获取套接字对象
- login生产最佳实践?