我在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.html
或header.jpg
它们会正确显示,但点击任一文件夹都会导航到(例如)localhost:8888/js
,即使链接明显导致localhost:8888/public/js
。进一步检查后发现请求是针对正确的路径(/public/js
)发送的,但服务器返回301 - Moved Permanently
响应,然后将浏览器重定向到/js
,后者继续显示错误页面,因为无法找到内容。 (不,真的吗?)
尝试在这些文件夹下请求特定文件(即:localhost:8888/public/js/main.js
)正常工作,并且没有相同的问题。
令人抓狂的部分是它在我的开发盒上做了一段时间,然后简单地......停止了。不知道为什么。但是,在尝试部署时,生产服务器开始出现相同的问题,即使我无法在我的开发环境中重现它。有谁知道为什么Express似乎有意将我的URL重写为错误的东西?
答案 0 :(得分:2)
原来答案非常简单,我只是因为我的浏览器缓存而错过了它。在深入了解Express(好的,技术上的Connect)代码并使用console.log()自由地进行编写之后,我将其追溯到静态中间件中的一些代码,该代码检测到该目录包含index.html文件并且正在尝试显示相反。不知何故,代码得到了错误的路径,并且发生了无效的重定向。
但真正的问题是,静态处理程序在目录中间件之前就已经起作用了,这是中间件声明顺序的直接结果。因此,只需简单地翻转中间件声明:
app.use("/public", express.directory("/web/content"));
app.use("/public", express.static("/web/content"));
解决了这个问题。
现在,我之前已经尝试过这个,但没有意识到我之前发送的301已被缓存,因此浏览器在重新定向之前甚至没有触及服务器。在翻转订单并清空缓存后,我能够正确地导航目录结构。
叹息如果我因为浏览器缓存而遇到的每个“错误”都有一美元......