Serveur statique

Middleware permettant de servir des fichiers statiques ou embarqués. Pour l'API détaillée, veuillez consulter la documentation.

Cas d'utilisation

Le service de fichiers statiques a de nombreuses applications dans les applications web :

  • Fournir des ressources statiques comme des fichiers CSS, JavaScript, images, etc.
  • Héberger des applications monopage (SPA)
  • Distribuer des documents, fichiers multimédias, contenus téléchargeables
  • Solution complète d'hébergement pour des sites simples

Fonctionnalités principales

  • StaticDir prend en charge les dossiers locaux statiques. Plusieurs dossiers peuvent être spécifiés en paramètre. Par exemple :
main.rs
Cargo.toml
static-dir-list/src/main.rs
use salvo::prelude::*;
use salvo::serve_static::StaticDir;

#[tokio::main]
async fn main() {
    tracing_subscriber::fmt().init();

    let router = Router::with_path("{*path}").get(
        StaticDir::new([
            "static-dir-list/static/boy",
            "static-dir-list/static/girl",
            "static/boy",
            "static/girl",
        ])
        .include_dot_files(false)
        .defaults("index.html")
        .auto_list(true),
    );

    let acceptor = TcpListener::new("0.0.0.0:5800").bind().await;
    Server::new(acceptor).serve(router).await;
}

Si le fichier n'est pas trouvé dans le premier dossier, la recherche se poursuit dans le second.

StaticDir prend en charge l'envoi prioritaire des fichiers compressés lorsqu'ils existent. Par exemple, s'il existe index.html, index.html.gz, index.html.zst, index.html.br, alors index.html.gz, index.html.zst, index.html.br sont considérés comme des versions précompressées de index.html et seront envoyés selon les informations de la requête.

  • Prise en charge de rust-embed, par exemple :

Avantages et inconvénients de rust-embed

Avantages :

  • Compilation des fichiers statiques dans le binaire, simplifiant le déploiement
  • Pas besoin de gérer séparément les fichiers statiques en production
  • Meilleures performances potentielles (accès mémoire vs I/O disque)
  • Plus sécurisé, les fichiers ne peuvent pas être modifiés accidentellement

Inconvénients :

  • Augmente la taille du binaire
  • Mise à jour du contenu statique nécessite une recompilation et redéploiement
  • Non adapté pour du contenu statique volumineux et fréquemment modifié
main.rs
Cargo.toml
static-embed-files/src/main.rs
use rust_embed::RustEmbed;
use salvo::prelude::*;
use salvo::serve_static::static_embed;

#[derive(RustEmbed)]
#[folder = "static"]
struct Assets;

#[tokio::main]
async fn main() {
    tracing_subscriber::fmt().init();

    let router = Router::with_path("{*path}").get(static_embed::<Assets>().fallback("index.html"));

    let acceptor = TcpListener::new("0.0.0.0:5800").bind().await;
    Server::new(acceptor).serve(router).await;
}

Il est possible de définir une page par défaut avec default. with_fallback et fallback permettent de spécifier un fichier de repli lorsqu'un fichier n'est pas trouvé, ce qui est utile pour certaines applications monopages.