node.js – ExpressJS在导航目录时错误地重写路径

我在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);

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

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

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

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

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

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

然而,真正的问题是静态处理程序在目录中间件之前起作用,这是声明中间件的顺序的直接结果.因此,简单地翻转中间件声明就像这样:

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

解决了这个问题.

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

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

点赞