使用 nodejs Connect 的静态服务器中间件仅服务于子目录



我正在尝试构建一个Web应用程序,其中:

http://example.com/static/x.png使用Connect的静态中间件将x.png作为静态文件提供http://example.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://example.com/static/x.png,请求绕过静态服务器并路由到我的应用程序的其余部分。我在调试器中逐步完成了代码,看起来static正在尝试查找static/static/x.png,而不是static/x.png。

我可以通过将connect.static(__dirname+'/static')更改为connect.statical(__dirname)来让它工作,但现在它将提供不在静态目录中的东西,这不好!

做我想做的事情最干净的方式是什么?我可能会使用Express的路由功能,但除非迫不得已,否则我并不特别想使用Express,因为我的应用程序的其余部分以自己的方式处理路由。

所以问题是URL路径和文件系统布局不匹配。有两个简单的peasy继续你的生活解决方案。

  1. 从URL中删除"static/"。静态中间件将只提供static目录下的文件,但URL不包括"静态"一词
  2. 执行以下操作:mkdir public && mv static public。除了static子目录之外,保持public目录为空。现在您的URL可以保持不变,并且在代码中需要app.use connect.static(__dirname + '/public')

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

如果你真的想在你的URL中有static/,但不想映射到静态根目录下的目录,那么在静态中间件之前添加一个中间件,改变req.path以删除前导的"/static",然后调用next(),我认为这会欺骗静态中间件做你想做的事。

最新更新