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

标签 node.js express

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

使用上面的 uber-simple express 服务器,当您导航到 localhost:8888/public 时,/web/content 的内容将显示为链接列表。所以,例如:

..
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 重写为错误的东西?

最佳答案

原来答案很简单,我只是因为我的浏览器缓存而错过了它。在挖掘 Express(好吧,技术上是 Connect)代码并大量使用 console.log() 后,我将其追溯到静态中间件中的一些代码,这些代码检测到该目录包含一个 index.html 文件并试图而是显示它。不知何故,该代码得到了错误的路径,并且发生了无效的重定向。

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

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

解决了这个问题。

现在,我之前确实尝试过这个,但没有意识到之前发送给我的 301 已被缓存,因此浏览器甚至在接触服务器之前就对我进行了重定向。翻转顺序并清空缓存后,我能够正确导航目录结构。

叹息如果我遇到的由浏览器缓存引起的每个“错误”都能得到一美元...

关于node.js - ExpressJS 在导航目录时错误地重写路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7641242/

相关文章:

javascript - node.js 在函数中保留局部变量,为什么?

javascript - req.body.username 未输出正确的值

javascript - 安装 Gulp : “no command ' gulp' found” 后

javascript - 将变量从 Node.js 服务器端 Controller 传递到 Angular.js 客户端 Controller

node.js - 你如何修改 generator-angular-fullstack 图标?

javascript - PM2 没有安装最新版本的 nodejs

node.js - MongoDB Atlas 和 Node JS - 架构布局

node.js - PassportJS 和重定向

javascript - 如何使用express-handlebars向用户显示MySQL "result"对象?

javascript - 如何将nodejs请求路由到另一个nodejs应用程序?