Node.js 从Express中提供静态文件(不带扩展名),使用同名子目录发布文件
这里的目标是为我的静态站点(使用nuxtjs生成)提供url,而不使用尾随斜杠 我想用url提供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
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?您可以为它们定义手动路线,这些路线完全符合您的要求。