ハンドル
ネストレベルが同じ他の handle
ブロックとは相互に排他的に、ディレクティブのグループを評価します。
つまり、複数の handle
ディレクティブが連続して現れる場合、一致する最初の handle
ブロックのみが評価されます。一致するものがなければ handle はフォールバックルートのように動作します。
handle
ディレクティブは、ディレクティブソートアルゴリズムに従って、マッチャーによってソートされます。handle_path
ディレクティブは特別なケースで、パスマッチャーを持つ handle
と同じ優先順位でソートされます。
必要に応じて、handle ブロックをネストできます。HTTP ハンドラディレクティブのみが handle ブロック内で使用できます。
構文
handle [<matcher>] {
<directives...>
}
- <directives...> は HTTP ハンドラディレクティブまたはディレクティブブロックのリストで、1 行に 1 つずつ記述され、handle ブロックの外で使用されるものとまったく同じです。
類似のディレクティブ
HTTP ハンドラディレクティブをラップできる他のディレクティブもありますが、それぞれが伝達する動作の用途によって異なります
-
handle_path
はhandle
と同じ処理を行いますが、ハンドラを実行する前に、リクエストからプレフィックスを削除します。 -
handle_errors
はhandle
のようなもので、リクエストの処理中に Caddy でエラーが発生した場合にのみ呼び出されます。 -
route
は、handle
が処理するように他のディレクティブをラップしますが、2 点の違いがあります。- route ブロックは相互に排他的ではありません。
- route 内のディレクティブは並び替えられず、必要に応じて詳細に制御できます。
例
/foo/
内のリクエストを静的ファイルサーバーで処理し、その他のリクエストをリバースプロキシで処理します。
example.com {
handle /foo/* {
file_server
}
handle {
reverse_proxy 127.0.0.1:8080
}
}
同じサイトで handle
とhandle_path
を組み合わせても、それらは相互に排他的になります。
example.com {
handle_path /foo/* {
# The path has the "/foo" prefix stripped
}
handle /bar/* {
# The path still retains "/bar"
}
}
handle
ブロックをネストして、より複雑なルーティングロジックを作成できます。
example.com {
handle /foo* {
handle /foo/bar* {
# This block only matches paths under /foo/bar
}
handle {
# This block matches everything else under /foo/
}
}
handle {
# This block matches everything else (acts as a fallback)
}
}