# Static File Server

cpp-httplibは、HTMLやCSS、画像ファイルなどの静的ファイルも配信できます。面倒な設定は要りません。`set_mount_point()` を1行呼ぶだけです。

## set_mount_point の基本

さっそくやってみましょう。`set_mount_point()` は、URLのパスとローカルディレクトリを紐づけます。

    #include "httplib.h"
    #include <iostream>

    int main() {
        httplib::Server svr;

        svr.set_mount_point("/", "./html");

        std::cout << "Listening on port 8080..." << std::endl;
        svr.listen("0.0.0.0", 8080);
    }

    #include "httplib.h"
    #include <iostream>

    int main() {
        httplib::Server svr;

        svr.set_mount_point("/", "./html");

        std::cout << "Listening on port 8080..." << std::endl;
        svr.listen("0.0.0.0", 8080);
    }

第1引数がURLのマウントポイント、第2引数がローカルのディレクトリパスです。この例だと、`/` へのリクエストを `./html` ディレクトリから配信します。

試してみましょう。まず `html` ディレクトリを作って、`index.html` を置きます。

    mkdir html

    mkdir html

    <!DOCTYPE html>
    <html>
    <head><title>My Page</title></head>
    <body>
        <h1>Hello from cpp-httplib!</h1>
        <p>This is a static file.</p>
    </body>
    </html>

    <!DOCTYPE html>
    <html>
    <head><title>My Page</title></head>
    <body>
        <h1>Hello from cpp-httplib!</h1>
        <p>This is a static file.</p>
    </body>
    </html>

コンパイルして起動します。

    g++ -std=c++17 -o server server.cpp -pthread
    ./server

    g++ -std=c++17 -o server server.cpp -pthread
    ./server

ブラウザで `http://localhost:8080` を開いてみてください。`html/index.html` の内容が表示されるはずです。`http://localhost:8080/index.html` でも同じページが返ります。

もちろん、前章のクライアントコードや `curl` でもアクセスできますよ。

    httplib::Client cli("http://localhost:8080");
    auto res = cli.Get("/");
    if (res) {
        std::cout << res->body << std::endl;  // HTMLが表示される
    }

    httplib::Client cli("http://localhost:8080");
    auto res = cli.Get("/");
    if (res) {
        std::cout << res->body << std::endl;  // HTMLが表示される
    }

    curl http://localhost:8080

    curl http://localhost:8080

## 複数のマウントポイント

`set_mount_point()` は何回でも呼べます。URLのパスごとに、別々のディレクトリを割り当てられます。

    svr.set_mount_point("/", "./public");
    svr.set_mount_point("/assets", "./static/assets");
    svr.set_mount_point("/docs", "./documentation");

    svr.set_mount_point("/", "./public");
    svr.set_mount_point("/assets", "./static/assets");
    svr.set_mount_point("/docs", "./documentation");

`/assets/style.css` なら `./static/assets/style.css` を、`/docs/guide.html` なら `./documentation/guide.html` を配信します。

## ハンドラーとの組み合わせ

静的ファイルの配信と、前章で学んだルーティングハンドラーは共存できます。

    httplib::Server svr;

    // APIエンドポイント
    svr.Get("/api/hello", [](const auto &, auto &res) {
        res.set_content(R"({"message":"Hello!"})", "application/json");
    });

    // 静的ファイル配信
    svr.set_mount_point("/", "./public");

    svr.listen("0.0.0.0", 8080);

    httplib::Server svr;

    // APIエンドポイント
    svr.Get("/api/hello", [](const auto &, auto &res) {
        res.set_content(R"({"message":"Hello!"})", "application/json");
    });

    // 静的ファイル配信
    svr.set_mount_point("/", "./public");

    svr.listen("0.0.0.0", 8080);

ハンドラーが先に評価されます。`/api/hello` にはハンドラーが応答し、それ以外のパスは `./public` ディレクトリからファイルを探します。

## レスポンスヘッダーの追加

`set_mount_point()` の第3引数にヘッダーを渡すと、静的ファイルのレスポンスにカスタムヘッダーを付けられます。キャッシュ制御に便利です。

    svr.set_mount_point("/", "./public", {
        {"Cache-Control", "max-age=3600"}
    });

    svr.set_mount_point("/", "./public", {
        {"Cache-Control", "max-age=3600"}
    });

こうすると、ブラウザは配信されたファイルを1時間キャッシュします。

## 静的ファイルサーバー用のDockerファイル

cpp-httplibのリポジトリには、静的ファイルサーバー用の `Dockerfile` が含まれています。Docker Hubにビルド済みイメージも公開しているので、1コマンドで起動できます。

    > docker run -p 8080:80 -v ./my-site:/html yhirose4dockerhub/cpp-httplib-server
    Serving HTTP on 0.0.0.0:80
    Mount point: / -> ./html
    Press Ctrl+C to shutdown gracefully...
    192.168.65.1 - - [22/Feb/2026:12:00:00 +0000] "GET / HTTP/1.1" 200 256 "-" "Mozilla/5.0 ..."
    192.168.65.1 - - [22/Feb/2026:12:00:00 +0000] "GET /style.css HTTP/1.1" 200 1024 "-" "Mozilla/5.0 ..."
    192.168.65.1 - - [22/Feb/2026:12:00:01 +0000] "GET /favicon.ico HTTP/1.1" 404 152 "-" "Mozilla/5.0 ..."

    > docker run -p 8080:80 -v ./my-site:/html yhirose4dockerhub/cpp-httplib-server
    Serving HTTP on 0.0.0.0:80
    Mount point: / -> ./html
    Press Ctrl+C to shutdown gracefully...
    192.168.65.1 - - [22/Feb/2026:12:00:00 +0000] "GET / HTTP/1.1" 200 256 "-" "Mozilla/5.0 ..."
    192.168.65.1 - - [22/Feb/2026:12:00:00 +0000] "GET /style.css HTTP/1.1" 200 1024 "-" "Mozilla/5.0 ..."
    192.168.65.1 - - [22/Feb/2026:12:00:01 +0000] "GET /favicon.ico HTTP/1.1" 404 152 "-" "Mozilla/5.0 ..."

`./my-site` ディレクトリの中身が、そのままポート8080で配信されます。NGINXと同じログ形式で、アクセスの様子を確認できますよ。

## 次のステップ

静的ファイルの配信ができるようになりましたね。HTMLやCSS、JavaScriptを配信するWebサーバーが、これだけのコードで作れます。

次は、HTTPSで暗号化通信をしてみましょう。まずはTLSライブラリのセットアップからです。

次: TLS Setup