ドキュメント
a project

ハンドル

ネストレベルが同じ他の handle ブロックとは相互に排他的に、ディレクティブのグループを評価します。

つまり、複数の handle ディレクティブが連続して現れる場合、一致する最初の handle ブロックのみが評価されます。一致するものがなければ handle はフォールバックルートのように動作します。

handle ディレクティブは、ディレクティブソートアルゴリズムに従って、マッチャーによってソートされます。handle_path ディレクティブは特別なケースで、パスマッチャーを持つ handle と同じ優先順位でソートされます。

必要に応じて、handle ブロックをネストできます。HTTP ハンドラディレクティブのみが handle ブロック内で使用できます。

構文

handle [<matcher>] {
	<directives...>
}
  • <directives...> は HTTP ハンドラディレクティブまたはディレクティブブロックのリストで、1 行に 1 つずつ記述され、handle ブロックの外で使用されるものとまったく同じです。

類似のディレクティブ

HTTP ハンドラディレクティブをラップできる他のディレクティブもありますが、それぞれが伝達する動作の用途によって異なります

  • handle_pathhandle と同じ処理を行いますが、ハンドラを実行する前に、リクエストからプレフィックスを削除します。

  • handle_errorshandle のようなもので、リクエストの処理中に Caddy でエラーが発生した場合にのみ呼び出されます。

  • route は、handle が処理するように他のディレクティブをラップしますが、2 点の違いがあります。

    1. route ブロックは相互に排他的ではありません。
    2. route 内のディレクティブは並び替えられず、必要に応じて詳細に制御できます。

/foo/ 内のリクエストを静的ファイルサーバーで処理し、その他のリクエストをリバースプロキシで処理します。

example.com {
	handle /foo/* {
		file_server
	}

	handle {
		reverse_proxy 127.0.0.1:8080
	}
}

同じサイトで handlehandle_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)
	}
}