ExpressJS在导航目录时错误地重写path

我在一个Node应用程序中遇到了一个与Express不一致的问题,在这个应用程序中,由于URL重写,我无法正确导航通过内置目录呈现。 用代码解释更容易:

var express = require('express'); var app = express.createServer(); app.use("/public", express.static("/web/content")); app.use("/public", express.directory("/web/content")); app.listen(8888); 

当您导航到localhost:8888/public时,在/web/content的内容上方使用超级简单快速服务器将显示为链接列表。 所以,例如:

 .. index.html header.jpg js (folder) css (folder) 

从那里,如果我点击index.htmlheader.jpg他们显示正确,但点击任一文件夹将导航到(例如) localhost:8888/js ,即使链接明确导致localhost:8888/public/js 。 进一步检查发现请求被发送到正确的path( /public/js ),但服务器返回一个301 - Moved Permanently响应,然后redirect浏览器到/js ,继续显示一个错误页面,因为内容无法find。 (不完全是?)

尝试请求这些文件夹下的特定文件(即: localhost:8888/public/js/main.js )工作正常,并没有相同的问题。

疯狂的部分是,这是在我的开发箱上做了一段时间,然后简单地…停下来。 不知道为什么。 但是,当尝试部署时,生产服务器开始出现相同的问题,即使我无法再在我的开发环境中重现该问题。 有谁知道为什么快递似乎是如此的重写我的url错误的东西?

原来,答案很简单,我只是因为我的浏览器caching而错过了。 通过快速(好,技术上连接)代码挖掘,并用console.log()自由洒水,我把它追溯到静态中间件的一些代码,检测到该目录包含一个index.html文件,并试图显示,而不是。 不知何故,代码得到了错误的path,并发生无效的redirect。

然而,真正的问题在于,静态处理程序是在目录中间件之前执行的,这是中间件声明顺序的直接结果。 像这样简单地翻转中间件声明:

 app.use("/public", express.directory("/web/content")); app.use("/public", express.static("/web/content")); 

解决了这个问题。

现在,我已经尝试过了,但是没有意识到之前发送的301已经被caching了,所以浏览器在接触服务器之前就redirect了我。 翻转订单并清空我的caching后,我能够正确导航目录结构。

叹息如果我有一个美元的每一个“错误”,我遇到了浏览器caching造成的…