nginxでURIを書き換えてリダイレクトしたいときrewriteを使うと思う。
典型的には以下のような感じ。
rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gof)$' /data?file=$3.$4. break;
ngx_http_rewrite_moduleのrewriteディレクティブはURIを書き換えるディレクティブだがリダイレクトも(大体)自動でしてくれる。
第三引数に指定できるフラグはlastとbreakとredirectとpermanentの4種類あるが、なくてもリダイレクトしてくれたりして挙動がよくわからなかったので調べた。
rewrite regex replacement [flag]
rewriteの構文はこんな感じ。渡ってきたURIをregexに従ってreplacementに置き換える。
その際、replacementがhttp://またはhttps://または$schemeで始まる際、フラグに関係なく処理は中断され、redirectフラグが指定された場合と同じ挙動する。
redirectフラグは302リダイレクトを返すフラグなので、結果的にreplacementがhttp://などのスキーマから始まっていた場合302リダイレクトが返ることになる。その際続く処理は中断されるのでわざわざbreakを付ける必要はない。
つまりredirectフラグがなくてもリダイレクトしてくれるのはなぜかというとスキーマ始まりのURLを書いているからであった。
ridirectフラグの説明には
used if a replacement string does not start with “http://”, “https://”, or “$scheme”;
とreplacementがスキーマで始まらない場合に使われると書いてある。
つまり、replacementにスキーマがついているかを最初に考え、次にフラグによってどういう挙動をするかを考えればrewriteの挙動が見えてくる。
lastとbreakの挙動は巷に良い解説記事が溢れているので言及しない。permanentは301でリダイレクトが返るフラグである。