Zum Inhalt springen
Deutsch

Statische Dateien

Dateien ausliefern, ohne zu einem backend-spezifischen Plugin zu greifen. getFromFile liefert eine Datei; getFromDirectory bildet eine URL auf einen Verzeichnisbaum ab; getFromBrowseableDirectory ergänzt HTML-Listings.

import { concat, getFromFile, getFromBrowseableDirectory, path } from 'actor-ts/http';
const routes = concat(
path('logo.svg', getFromFile('./assets/logo.svg')),
getFromBrowseableDirectory('static', './public'), // mountet unter /static
);

getFromDirectory([routePrefix,] fsRoot, options?) — mit routePrefix mountet es darunter (z. B. /static/...), ohne mountet es an der Wurzel.

Builder-MethodeFeldDefault
withIndexFiles(...n)indexFiles['index.html'] ([] deaktiviert)
withBrowse(flag?)browsefalse
withCacheControl(v)cacheControlHeader entfällt
withEtag(flag)etagtrue (schwach, size+mtime)
withLastModified(flag)lastModifiedtrue
withRanges(flag)rangestrue
withDotfiles('deny' | 'allow')dotfiles'deny'
withSymlinks('within-root' | 'follow')symlinks'within-root'
withContentTypes(map)contentTypes— (ext → type Overrides)
withMaxFileSize(bytes)maxFileSize50 MiB (größer → 413)
  • Conditional Requests — ein schwaches ETag (size + mtime) und Last-Modified; passendes If-None-Match / If-Modified-Since304.
  • Range — ein einzelner bytes=-Range → 206 (oder 416, wenn unerfüllbar); Accept-Ranges: bytes wird angekündigt.
  • Verzeichnisse — ein Request ohne Trailing-Slash 301-redirectet, um ihn zu ergänzen (Query erhalten); mit Slash werden Index-Dateien der Reihe nach probiert, dann ein Listing (falls Browsing) oder 404.
  • HEAD — volle Header, leerer Body, kein Dateilesen.

Content-Types kommen von contentTypeFor(pathOrExt, overrides?) — einer kleinen Registry von ~45 gängigen Web-Typen. Text-artige Typen erhalten ; charset=utf-8; unbekannte Endungen fallen auf application/octet-stream zurück. Pro Route mit withContentTypes({ ext: 'type' }) überschreiben oder contentTypeFor direkt aufrufen, wenn du Responses von Hand baust.

Der URL-Rest wird vor der Validierung vollständig dekodiert (jede Encoding-Schicht abgetragen), dann wird jedes Pfad-Segment abgelehnt, wenn es .., leer, ein NUL, ein Backslash oder ein :-Segment ist (Windows-Laufwerk / NTFS Alternate Data Stream); absolute Formen werden verweigert, der zusammengesetzte Pfad wird auf die Wurzel eingegrenzt, und ein Symlink, der die Wurzel verlässt, wird verweigert (within-root- Default). Dotfiles sind standardmäßig verboten. Jede Ablehnung ist ein einheitlicher 404 — kein Informationsleck über Existierendes.

  • Route-DSL — wie Direktiven komponieren.
  • HTML & XSS — das Listing escapet Dateinamen mit denselben Helfern.
  • Sicherheit — der empfohlene Stack.