Исключить подкаталог из статических файлов в экспресс
Есть ли способ исключить подкаталог из экспресс-статического промежуточного программного обеспечения в Экспресс 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 - это другое приложение angular который извлекает скрипты из /exclude_me/scripts И из /public/scripts.
Я знаю, что это немного запутанно, но так оно и есть, и я не могу просто удалить его из публичного каталога, потому что он больше не увидит public/scripts, которые мне нужны, и я не могу его покинуть потому что я не могу авторизовать его (все авторизации в public/scripts)
Если есть какой-то более умный способ сделать это, не стесняйтесь, дайте мне знать:)
Ответы
Ответ 1
Вы можете добавить свое собственное промежуточное программное обеспечение. Вот что я сделал, чтобы исключить некоторые папки:
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')))
Ответ 2
Это возможно, добавив регулярные выражения к первому необязательному параметру метода use
.
В соответствии с Экспресс 4.x API-интерфейсом.
Например, я не хочу предоставлять доступ к моей папке 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');
Ответ 3
У меня была аналогичная проблема, которая может быть ответом, который вы искали. Учитывая следующий каталог:
public
css/
images/
secure/
index.html
Я хотел бы найти пакет промежуточного программного обеспечения Express:
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));
Это будет работать только с общедоступными файлами, если они не аутентифицированы, и только после того, как аутентификация будет использоваться только в защищенных файлах.
Ответ 4
В большинстве решений выше используется промежуточное программное обеспечение.
Однако есть простой способ решить эту проблему.
Не используйте статические анализы непосредственно с dir public
вместо того, чтобы обслуживать только то, что вы хотите использовать с префиксом виртуального пути.
Вы можете использовать, как показано ниже
var express = require('express');
var app = express();
app.use('/public', __dirname + 'css');
app.use('/public', __dirname + 'images');
...