我正在尝试构建一个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继续你的生活解决方案。
- 从URL中删除"static/"。静态中间件将只提供
static
目录下的文件,但URL不包括"静态"一词 - 执行以下操作:
mkdir public && mv static public
。除了static
子目录之外,保持public
目录为空。现在您的URL可以保持不变,并且在代码中需要app.use connect.static(__dirname + '/public')
现在,这就是静态中间件提供的开箱即用功能。URL必须简单地映射到文件系统。这就是为什么它"只是工作"而且很简单。
如果你真的想在你的URL中有static/
,但不想映射到静态根目录下的目录,那么在静态中间件之前添加一个中间件,改变req.path以删除前导的"/static",然后调用next()
,我认为这会欺骗静态中间件做你想做的事。