2013年10月4日金曜日

nginxのsetディレクティブはrewriteモジュールに属する罠

nginxでは変数をセットするときにsetディレクティブを使います。例えば

set $script "";
set $path_info $uri;

というようにです。ところで、このsetディレクティブはngx_http_rewrite_moduleに属します。 つまり、rewrite と組み合わせて

location /download/ {
    rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
    set $script "";
    set $path_info $uri;
    fastcgi_pass unix:/tmp/fastcgi.sock;
}

なんていうことをしていると、rewriteが発動してbreakされた瞬間にrewriteモジュールの評価が終わってしまい、setされません。

location /download/ {
    rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3;
    set $script "";
    set $path_info $uri;
    break;
    fastcgi_pass unix:/tmp/fastcgi.sock;
}

というふうに、breakする場所をsetの後にする必要があります。

ハマりました。

1 件のコメント: