有没有办法在Express中提供无扩展名的静态HTML文件?

26
我可以为您服务并返回一个没有指定扩展名的HTML文件。是否有任何方法可以在不定义路由的情况下实现这一点?例如,而不是使用:
 /helloworld.html

我只想做

 /helloworld
5个回答

73

你可以在express.static方法中使用扩展选项。

app.use(express.static(path.join(__dirname, 'public'),{index:false,extensions:['html']}));

很棒的答案,Dai。 - parwatcodes
7
app.use(express.static(<public dir>,{extensions:['html']}))就足够了,否则你需要访问example.com/index.html作为example.com/index - wolfram77
这应该是最佳答案。我们在推出一个不从/提供服务的index.html后第一时间就亲身体验到了这一点,这非常出乎意料。 - Dawson B

24
一个快速而不太优雅的解决方案是将.html附加到那些没有点号且公共目录中存在HTML文件的请求上:
var fs        = require('fs');
var publicdir = __dirname + '/public';

app.use(function(req, res, next) {
  if (req.path.indexOf('.') === -1) {
    var file = publicdir + req.path + '.html';
    fs.exists(file, function(exists) {
      if (exists)
        req.url += '.html';
      next();
    });
  }
  else
    next();
});
app.use(express.static(publicdir));

好的。只有一个问题。这会拦截所有公共请求吗?假设我想为公共目录中的CSS提供服务,我将添加扩展名,那么这会出现问题吗? - Akshat Jiwan Sharma
它只会考虑文件名中没有句号的请求。因此,如果您使用“.css”扩展名提供CSS文件,则不应该有问题(但是它首先检查“.html”文件是否存在,如果不存在,则什么也不做,并让静态中间件按原样处理)。 - robertklep

4
这一行代码可以将public文件夹中的所有HTML文件路由到一个单独的线路中。
app.use(express.static('public',{extensions:['html']}));

3
虽然Robert的答案更加优美,但还有另一种方法可以实现这个目标。为了完整起见,我添加了这个答案。要服务于没有扩展名的静态文件,你可以创建一个以该路由名称命名的文件夹,并在其中创建一个index.html文件。
举个例子,如果我想在/hello上服务于名为hello.html的文件,那么我将创建一个名为hello的文件夹,并在其中放置一个index.html文件。现在当'/hello'被调用时,express将自动提供此文件而无需扩展名。
这是所有Web框架都支持的显而易见的方法,但当时我错过了它。

2
在大型项目中并不可行。 - jdrake

1
如果你想像我一样反向操作(将名为“helloworld”的html文件作为html提供),那么这是我使用的中间件。
var express = require('express');
var app = express();

app.use(function(req, res, next) {
  if (req.path.indexOf('.') === -1) {
    res.setHeader('Content-Type', 'text/html');
  }
  next();
});

app.use('/', express.static(__dirname + '/public'));

app.listen(8080, function () {
  console.log('App listening on port 8080!');
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接