使用nodejs Connect的静态服务器中间件只提供一个子目录

我试图build立一个Web应用程序在哪里:

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时 ,请求绕过了静态服务器,并被路由到我的应用程序的其余部分。 我在debugging器中遍历代码,它看起来像静态试图查找static / static / x.png而不是static / x.png。

我可以通过改变connect.static(_ dirname +'/ static')来connect.static( _dirname),但现在它会提供不在静态目录中的东西,这是不好的!

什么是我正在做的最干净的方式? 我大概可以使用Express的路由function,但我不特别想使用Express,除非必须,因为我的应用程序的其余部分以自己的方式处理路由。

谢谢!

所以问题是你的URLpath和你的文件系统布局不匹配。 有两个简单易上手的解决scheme。

  1. 从您的url中移除“static /”。 静态中间件只能提供static目录下的文件,但URL不包含“静态”一词。
  2. 这样做: mkdir public && mv static public 。 将public目录保留为空,而不是static子目录。 现在你的URL可以保持不变,在你的代码中你需要app.use connect.static(__dirname + '/public')

现在,这就是静态中间件提供的开箱即用function。 URL必须简单地映射到文件系统。 这就是为什么它“正常工作”,而且很简单。

如果你真的想在你的URL中使用static/而不是映射到静态根目录下的一个目录,那么在静态中间件之前添加一个中间件,改变req.path去除前导的“/ static”,然后调用next()和I认为会欺骗静态中间件做你想做的事情。