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

时间:2011-10-03 22:09:26

标签: node.js express

我在Node应用程序中遇到了一个令人抓狂的问题,由于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);

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

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

如果我点击index.htmlheader.jpg它们会正确显示,但点击任一文件夹都会导航到(例如)localhost:8888/js,即使链接明显导致localhost:8888/public/js。进一步检查后发现请求是针对正确的路径(/public/js)发送的,但服务器返回301 - Moved Permanently响应,然后将浏览器重定向到/js,后者继续显示错误页面,因为无法找到内容。 (不,真的吗?)

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

令人抓狂的部分是它在我的开发盒上做了一段时间,然后简单地......停止了。不知道为什么。但是,在尝试部署时,生产服务器开始出现相同的问题,即使我无法在我的开发环境中重现它。有谁知道为什么Express似乎有意将我的URL重写为错误的东西?

1 个答案:

答案 0 :(得分:2)

原来答案非常简单,我只是因为我的浏览器缓存而错过了它。在深入了解Express(好的,技术上的Connect)代码并使用console.log()自由地进行编写之后,我将其追溯到静态中间件中的一些代码,该代码检测到该目录包含index.html文件并且正在尝试显示相反。不知何故,代码得到了错误的路径,并且发生了无效的重定向。

但真正的问题是,静态处理程序在目录中间件之前就已经起作用了,这是中间件声明顺序的直接结果。因此,只需简单地翻转中间件声明:

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

解决了这个问题。

现在,我之前已经尝试过这个,但没有意识到我之前发送的301已被缓存,因此浏览器在重新定向之前甚至没有触及服务器。在翻转订单并清空缓存后,我能够正确地导航目录结构。

叹息如果我因为浏览器缓存而遇到的每个“错误”都有一美元......