Исключить подкаталог из статических файлов в экспресс

Есть ли способ исключить подкаталог из экспресс-статического промежуточного программного обеспечения в Экспресс 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');
...