Drop the spaces between Japanese text and inline code or alphanumerics in the tour and the few other pages that still had them, and reword sentences that read awkwardly. The client compression page now lists Zstd alongside zlib and Brotli.
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