nginxで転送ルールを書くときにハマったのでメモ。
rewrite ^/test/(\d*)$ /test2-$1.html permanent;
みたいに正規表現を使って書くことがあります。
ここでちょっと格好つけて、文字数を指定する正規表現{1,9}みたいなのを付けたらうまくいかなかったのです。
例えばこんな具合。({1,9}は1~9個っていう意味の正規表現です)。
rewrite ^/test/(\d{1,9})$ /test2-$1.html premanent;
ただ、nginxではサーバーの構文で{}が使われているため、””でくくらないと以下のエラーが出ます。
nginx: [emerg] directive "rewrite" is not terminated by ";" in /etc/nginx/xxxxxxxx.conf
このエラーは「rewriteは;で終わらないとダメだよ」っていうエラーなんですが、本当の問題は{}が””内で使われていないためです。
つまり文字数指定の{}はそのままでは使えないので、転送前のルールを””で囲って以下のようにしたらうまくいきました。
rewrite "^/test/(\d{1,9})$" /test2-$1.html premanent;
すごい初歩的なことなんだけど、本を読んでやらないとこういうことがおきるんですね。