2015-02-23 98 views
11

子目錄有沒有什麼辦法排除快速靜態中間件子目錄表達 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是另一個角度的應用程序,從/exclude_me /腳本獲取腳本從/public/scripts

我知道這是有點混亂,但它是怎麼回事,我不能只是從公共目錄中刪除它,因爲它不會看到公共/腳本更多需要哪些,我不能離開它,因爲我不能授權然後,它(的所有授權是公共/腳本

如果沒有做到這一點一些更聰明的辦法,隨時讓我知道:)

+0

你是什麼意思裏面的東西依賴於它? – 2015-02-23 18:33:47

+0

我在問題 – 2015-02-23 18:48:08

回答

11

你可以添加你自己的中間件。下面是我做的排除一些文件夾:

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

我有一個類似的問題,這可能是你正在尋找的答案。考慮到以下目錄:

public 
    css/ 
    images/ 
    secure/ 
    index.html 

捷運中間件堆棧,我想是這樣的:

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

通過向第一個可選參數use方法添加正則表達式,可以實現這一點。

根據Express 4.x API path documentation

例子,我不想給我的文件夾securepublic內訪問:

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'); 
+1

中添加了其他信息,您真是個很酷的人。只是想我會讓你知道的。 – moeiscool 2017-06-19 23:46:56

0

上面的大多數解決方案都是使用中間件。

但是,有一個簡單的方法來解決這個問題。

請勿直接使用目錄直接提供靜態集合,而不是直接爲虛擬路徑前綴提供目標服務。

你可以成爲像下面

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

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