nginxでネストされたlocationの優先順位

nginxの設定ファイルではlocationをネストできる。つぎのような書き方をしてみた。

location /foo/ {
	location ^~ /foo/bar/ {
		# do something
	}
}

location ~ \.json$ {
	# do something
}

/foo/bar/baz.jsonというリクエストがくると、どの設定がえらばれるか?

結果は、正規表現の~ \.json$がえらばれる。 前方一致で最長の^~ /foo/bar/がえらばれて、正規表現は無視されるものだと勘違いしていた。

ネストが優先順位に影響すると思っていなかった。読みやすくするためにネストを使っていた。優先順位が分かりづらくなるのでネストをやめることにした。

ドキュメントを読んでいても分からなかった。nginxでデバッグログを出力させると、どの設定が評価されて選択されたのか一目瞭然で助かった。