キャッシングヘッダー
必須の依存関係: io.ktor:ktor-server-caching-headers
コード例: caching-headers
CachingHeaders プラグインは、HTTP キャッシングに使用される Cache-Control および Expires ヘッダーを設定する機能を追加します。キャッシングは以下の方法で設定できます:
- 画像、CSS、JavaScript ファイルなどの特定のコンテンツタイプに対して、異なるキャッシュ戦略を設定する。
- アプリケーションレベルでのグローバル、ルートレベル、または特定のコールといった、さまざまなレベルでキャッシングオプションを指定する。
依存関係の追加
CachingHeaders を使用するには、ビルドスクリプトに ktor-server-caching-headers アーティファクトを含める必要があります。
CachingHeaders のインストール
CachingHeaders プラグインをアプリケーションにインストールするには、指定された
install 関数に渡します。 以下のコードスニペットは、CachingHeaders をインストールする方法を示しています... - ...
embeddedServer関数の呼び出し内。 - ...
Applicationクラスの拡張関数である、明示的に定義されたmodule内。
CachingHeaders プラグインは、特定のルートにインストールすることもできます。 これは、アプリケーションのリソースごとに異なる CachingHeaders 設定が必要な場合に便利です。
CachingHeaders をインストールした後、さまざまなコンテンツタイプに対してキャッシング設定を構成できます。
キャッシングの設定
CachingHeaders プラグインを設定するには、特定の ApplicationCall とコンテンツタイプに対して指定されたキャッシングオプションを提供するために、options 関数を定義する必要があります。caching-headers の例のコードスニペットは、プレーンテキストと HTML に対して max-age オプションを含む Cache-Control ヘッダーを追加する方法を示しています:
fun Application.module() {
routing {
install(CachingHeaders) {
options { call, content ->
when (content.contentType?.withoutParameters()) {
ContentType.Text.Plain -> CachingOptions(CacheControl.MaxAge(maxAgeSeconds = 3600))
ContentType.Text.Html -> CachingOptions(CacheControl.MaxAge(maxAgeSeconds = 60))
else -> null
}
}
}
}
}CachingOptions オブジェクトは、パラメータとして Cache-Control および Expires ヘッダーの値を受け入れます:
cacheControlパラメータは CacheControl 値を受け入れます。CacheControl.MaxAgeを使用してmax-ageパラメータと、可視性、再検証オプションなどの関連設定を指定できます。CacheControl.NoCache/CacheControl.NoStoreを使用してキャッシングを無効にすることもできます。expiresパラメータを使用すると、ExpiresヘッダーをGMTDateまたはZonedDateTime値として指定できます。
ルートレベル
プラグインはグローバルだけでなく、特定のルートにもインストールできます。例えば、以下の例は /index ルートに対して指定されたキャッシングヘッダーを追加する方法を示しています:
route("/index") {
install(CachingHeaders) {
options { call, content -> CachingOptions(CacheControl.MaxAge(maxAgeSeconds = 1800)) }
}
get {
call.respondText("Index page")
}
}コールレベル
より詳細なキャッシング設定が必要な場合は、ApplicationCall.caching プロパティを使用してコールレベルでキャッシングオプションを設定できます。以下の例は、ユーザーがログインしているかどうかに応じてキャッシングオプションを設定する方法を示しています:
route("/profile") {
get {
val userLoggedIn = true
if(userLoggedIn) {
call.caching = CachingOptions(CacheControl.NoStore(CacheControl.Visibility.Private))
call.respondText("Profile page")
} else {
call.caching = CachingOptions(CacheControl.MaxAge(maxAgeSeconds = 900))
call.respondText("Login page")
}
}
}ユーザーのログインには、Authentication および Sessions プラグインを使用できます。
