Node.js 从Express中提供静态文件(不带扩展名),使用同名子目录发布文件

Node.js 从Express中提供静态文件(不带扩展名),使用同名子目录发布文件,node.js,express,Node.js,Express,这里的目标是为我的静态站点(使用nuxtjs生成)提供url,而不使用尾随斜杠 我想用url提供foo.html 为此,我使用expressstatic和extensions选项 app.use(express.static(__dirname + '/public', { extensions: 'html' })) 除非html文件与文件夹同名,否则该操作正常。 让我们考虑一下这个文件树: foo.html bar.html bar/baz.html /foo将提供foo.html /b

这里的目标是为我的静态站点(使用nuxtjs生成)提供url,而不使用尾随斜杠

我想用url提供
foo.html
为此,我使用expressstatic和extensions选项

app.use(express.static(__dirname + '/public', { extensions: 'html' }))
除非html文件与文件夹同名,否则该操作正常。 让我们考虑一下这个文件树:

foo.html
bar.html
bar/baz.html
/foo
将提供
foo.html

/bar/baz
将提供
baz.html

但是
/bar
将重定向到
/bar/

我尝试以这种方式停用重定向选项:

app.use(express.static(__dirname + '/public', { extensions: 'html', redirect: false }))
现在
/bar
不再重定向,但文件
bar.html
仍然没有提供

快车正在移动到下一个()

我能够提供bar.html,在其他路由之后添加:

app.use(function(req, res, next) {
    var file = __dirname + '/public' + req.path + '.html'
    fs.exists(file, function(exists) {
        if (exists) res.sendFile(file)
        else next()
    })
})

但是我觉得这不应该是正确的方法,我应该能够使用static为我的所有文件提供服务。

从Express 4.8.0开始,您可以将其用作Express.static的替代品。它使用相同的支持代码,并支持相同的功能,如HTTP缓存支持、内容类型头等

const root = path.join(__dirname, '/public');
app.use((req, res, next) => {
  const file = req.url + ".html";
  fs.exists(path.join(root, file), (exists) =>
    exists ? res.sendFile(file, {root}) : next()
  );
});

我不清楚您到底想做什么,但是当
express.static()
发现
/foo
与静态文件层次结构中的
foo
目录匹配时,它会在该目录中查找
index.html
文件,如果找到,它将提供该服务。也许您可以用它来解决您的问题。确切地说,当:
express.static()
发现
/foo
与静态文件层次结构中的
foo
目录匹配时,它将重定向到
/foo/
,然后,
/foo/
请求将被提供
/foo/index.html
,但由于该重定向url将是带有尾部斜杠的
/foo/
。问题是,我的站点是用nuxt js生成的,它作为一个单页应用程序运行,具有可见的href,没有斜杠,因此看起来我的所有链接都指向301重定向。我的老板认为这很糟糕(因为他的SEOs工具会显示一些红色)。你有多少这样的目录URL?您可以为它们定义手动路线,这些路线完全符合您的要求。