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でリダイレクトが返るフラグである。