我在Node应用程序中遇到了一个令人抓狂的问题,由于URL重写,我无法正确浏览内置目录渲染.使用代码更容易解释: var express = require('express');var app = express.createServer();app.use("/public",
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已被缓存,因此浏览器在重新定向之前甚至触摸服务器.翻转订单并清空缓存后,我能够正确导航目录结构.
叹气如果我因为浏览器缓存而遇到的每个“错误”都有一美元…