Express.js
Static files y downloads
Explica cómo servir assets y downloads con rutas seguras, cache, Content-Disposition, range requests y protección frente a path traversal.
- Última actualización
- Actualizada
- Nivel
- Aplicación
Express.js
Explica cómo servir assets y downloads con rutas seguras, cache, Content-Disposition, range requests y protección frente a path traversal.
express.staticLos archivos estáticos no cambian por request y pueden servirse sin ejecutar lógica de negocio:
app.use('/assets', express.static('public', {
immutable: true,
maxAge: '1y',
dotfiles: 'deny',
}));El prefijo /assets se traduce a archivos bajo un root controlado.
Un nombre con hash:
app.a8f20c.jspuede cachearse largo tiempo porque un cambio produce otro nombre:
Cache-Control: public, max-age=31536000, immutableHTML no suele usar esa política porque debe apuntar a los assets nuevos.
Usa una ruta absoluta calculada desde código o configuración. express.static resuelve respecto al directorio de ejecución si recibe un path relativo, lo que puede variar entre desarrollo y producción.
Decide conscientemente si servir .well-known, archivos ocultos o index.html. Nunca expongas .env, source maps privados, backups o repositorios.
Un archivo privado necesita autorización antes de iniciar la respuesta:
router.get('/:fileId/download', async (_request, response) => {
const file = await getAuthorizedFile.execute({
actor: response.locals.actor,
fileId: response.locals.fileId,
});
response.download(file.absolutePath, file.downloadName);
});Para object storage, una signed URL corta suele ser más eficiente.
attachment; filename="invoice.pdf"indica descarga. inline permite renderizado y puede ser peligroso para HTML/SVG no confiable. Genera filenames seguros y usa codificación correcta para Unicode.
Videos y archivos grandes pueden usar Range. Node/Express o el storage deben responder 206 y rangos válidos. Implementarlo manualmente requiere validar límites y evitar lecturas arbitrarias.
No marques como public una response privada. Signed URLs pueden cachearse según diseño, pero la URL misma es una credencial temporal y no debe aparecer en logs o referrers innecesarios.
Un CDN suele servir assets públicos mejor:
La app conserva metadata, autorización y generación de URLs.
DomiSys puede servir:
Los tres archivos no deben compartir la misma política.
express.static para uploads privados.Content-Disposition manualmente sin escapar.Servir desde Express simplifica desarrollo, pero un CDN u object storage escala mejor. Signed URLs reducen carga, aunque ceden temporalmente control directo al poseedor de la URL.
inline para HTML subido?Streams, backpressure y respuestas grandes procesa datos progresivamente sin bufferizar todo el contenido.