2012-03-19 28 views
1

我試圖建立一個Web應用程序,其中:使用連接的NodeJS的靜態服務器中間件只服務於一個子目錄

http://mydomain.com/static/x.png供應x.png作爲一個靜態文件中使用Connect的靜態中間件 http://mydomain.com/other_stuff做其他的東西

我的目錄結構是

start_server.coffee 
static/ 
    x.png 

在start_server.coffee我:

app = connect() 
app.use connect.staticCache() 
app.use connect.static(__dirname + '/static') 

app.use ...middleware that serves the dynamic parts of my app... 

app.listen 80 

當我嘗試http://mydomain.com/static/x.png時,請求繞過靜態服務器並被路由到我的應用程序的其餘部分。我在調試器中遍歷代碼,它看起來像靜態試圖查找static/static/x.png而不是static/x.png。

我能得到它通過改變工作connect.static(_ 目錄名稱+「/靜態」),以connect.static( _dirname),但現在它將成爲東西,這不是在靜態目錄這是不好!

什麼是最乾淨的做我想做的事情?我大概可以使用Express的路由功能,但除非必須使用Express,否則我並不特別想使用Express,因爲我的應用程序的其餘部分以自己的方式處理路由。

謝謝!

回答

2

所以問題是你的URL路徑和你的文件系統佈局不匹配。有2個簡單易上手的解決方案。

  1. 從您的網址中移除「static /」。靜態中間件只會提供static目錄下的文件,但URL不會包含「靜態」一詞。
  2. 執行此操作:mkdir public && mv static public。將public目錄保留爲空,而不是static子目錄。現在您的網址可以保持不變,在您的代碼中您需要app.use connect.static(__dirname + '/public')

現在,這是靜態中間件提供的開箱即用功能。 URL必須簡單映射到文件系統。這就是爲什麼它「起作用」並且很簡單。

如果你真的想在static/您的網址,但不會映射到一個目錄中的靜態根目錄下,它改變req.path刪除前導「/靜」,然後調用next()和靜態中間件前添加一箇中間件我認爲這會欺騙靜態中間件去做你想做的事。

+0

謝謝!我想我會去#2 ... – josh 2012-03-20 13:21:53