Serve static files
[![NPM Version][npm-version-image]][npm-url]
[![NPM Downloads][npm-downloads-image]][npm-url]
[![CI][github-actions-ci-image]][github-actions-ci-url]
[![Test Coverage][coveralls-image]][coveralls-url]
This is a Node.js module available through the
npm registry. Installation is done using thenpm install command:
``sh`
$ npm install serve-static
`js`
const serveStatic = require('serve-static')
Create a new middleware function to serve files from within a given root
directory. The file to serve will be determined by combining req.urlnext()
with the provided root directory. When a file is not found, instead of
sending a 404 response, this module will instead call to move on
to the next middleware, allowing for stacking and fall-backs.
#### Options
##### acceptRanges
Enable or disable accepting ranged requests, defaults to true.
Disabling this will not send Accept-Ranges and ignore the contentsRange
of the request header.
##### cacheControl
Enable or disable setting Cache-Control response header, defaults toimmutable
true. Disabling this will ignore the and maxAge options.
##### dotfiles
Set how "dotfiles" are treated when encountered. A dotfile is a file
or directory that begins with a dot ("."). Note this check is done on
the path itself without checking if the path actually exists on the
disk. If root is specified, only the dotfiles above the root are
checked (i.e. the root itself can be within a dotfile when set
to "deny").
- 'allow' No special treatment for dotfiles.'deny'
- Deny a request for a dotfile and 403/next().'ignore'
- Pretend like the dotfile does not exist and 404/next().
The default value is 'ignore'.
##### etag
Enable or disable etag generation, defaults to true.
##### extensions
Set file extension fallbacks. When set, if a file is not found, the given
extensions will be added to the file name and search for. The first that
exists will be served. Example: ['html', 'htm'].
The default value is false.
##### fallthrough
Set the middleware to have client errors fall-through as just unhandled
requests, otherwise forward a client error. The difference is that client
errors like a bad request or a request to a non-existent file will cause
this middleware to simply next() to your next middleware when this valuetrue
is . When this value is false, these errors (even 404s), will invokenext(err).
Typically true is desired such that multiple physical directories can be
mapped to the same web address or for routes to fill in non-existent files.
The value false can be used if this middleware is mounted at a path that
is designed to be strictly a single file system directory, which allows for
short-circuiting 404s for less overhead. This middleware will also reply to
all methods.
The default value is true.
##### immutable
Enable or disable the immutable directive in the Cache-Control responsefalse
header, defaults to . If set to true, the maxAge option shouldimmutable
also be specified to enable caching. The directive will preventmaxAge
supported clients from making conditional requests during the life of the option to check if the file has changed.
##### index
By default this module will send "index.html" files in response to a request
on a directory. To disable this set false or to supply a new index pass a
string or an array in preferred order.
##### lastModified
Enable or disable Last-Modified header, defaults to true. Uses the file
system's last modified value.
##### maxAge
Provide a max-age in milliseconds for http caching, defaults to 0. This
can also be a string accepted by the ms
module.
##### redirect
Redirect to trailing "/" when the pathname is a dir. Defaults to true.
##### setHeaders
Function to set custom headers on response. Alterations to the headers need to
occur synchronously. The function is called as fn(res, path, stat), where
the arguments are:
- res the response objectpath
- the file path that is being sentstat
- the stat object of the file that is being sent
`js
const finalhandler = require('finalhandler')
const http = require('http')
const serveStatic = require('serve-static')
// Serve up public/ftp folder
const serve = serveStatic('public/ftp', { index: ['index.html', 'index.htm'] })
// Create server
const server = http.createServer((req, res) => {
serve(req, res, finalhandler(req, res))
})
// Listen
server.listen(3000)
`
`js
const contentDisposition = require('content-disposition')
const finalhandler = require('finalhandler')
const http = require('http')
const serveStatic = require('serve-static')
// Serve up public/ftp folder
const serve = serveStatic('public/ftp', {
index: false,
setHeaders: setHeaders
})
// Set header to force download
function setHeaders (res, path) {
res.setHeader('Content-Disposition', contentDisposition(path))
}
// Create server
const server = http.createServer((req, res) => {
serve(req, res, finalhandler(req, res))
})
// Listen
server.listen(3000)
`
#### Simple
This is a simple example of using Express.
`js
const express = require('express')
const serveStatic = require('serve-static')
const app = express()
app.use(serveStatic('public/ftp', { index: ['default.html', 'default.htm'] }))
app.listen(3000)
`
#### Multiple roots
This example shows a simple way to search through multiple directories.
Files are searched for in public-optimized/ first, then public/ second
as a fallback.
`js
const express = require('express')
const path = require('path')
const serveStatic = require('serve-static')
const app = express()
app.use(serveStatic(path.join(__dirname, 'public-optimized')))
app.use(serveStatic(path.join(__dirname, 'public')))
app.listen(3000)
`
#### Different settings for paths
This example shows how to set a different max age depending on the served
file. In this example, HTML files are not cached, while everything else
is for 1 day.
`js
const express = require('express')
const path = require('path')
const serveStatic = require('serve-static')
const app = express()
app.use(serveStatic(path.join(__dirname, 'public'), {
maxAge: '1d',
setHeaders: setCustomCacheControl
}))
app.listen(3000)
function setCustomCacheControl (res, file) {
if (path.extname(file) === '.html') {
// Custom Cache-Control for HTML files
res.setHeader('Cache-Control', 'public, max-age=0')
}
}
``
[coveralls-image]: https://badgen.net/coveralls/c/github/expressjs/serve-static/master
[coveralls-url]: https://coveralls.io/r/expressjs/serve-static?branch=master
[github-actions-ci-image]: https://badgen.net/github/checks/expressjs/serve-static/master?label=linux
[github-actions-ci-url]: https://github.com/expressjs/serve-static/actions/workflows/ci.yml
[node-image]: https://badgen.net/npm/node/serve-static
[node-url]: https://nodejs.org/en/download/
[npm-downloads-image]: https://badgen.net/npm/dm/serve-static
[npm-url]: https://npmjs.org/package/serve-static
[npm-version-image]: https://badgen.net/npm/v/serve-static