Files
cpp-httplib/docs-src/pages/ja/tour/04-static-file-server.md
yhirose c95d799180 Polish the wording of the updated docs pages
Reword the Japanese sentences so they read naturally, and correct the
size of the llama.cpp server sources in the code reading chapter.
2026-10-08 20:39:13 -04:00

4.5 KiB

title, order
title order
Static File Server 4

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);
}

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

試してみましょう。まず html ディレクトリを作って、index.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>

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

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が表示される
}
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");

/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);

リクエストが来ると、まず./publicディレクトリからファイルを探し、見つからなければハンドラーを呼びます。./public/api/helloというファイルを置かない限り、/api/helloにはハンドラーが応答します。

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

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

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 ..."

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

次のステップ

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

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

次: TLS Setup