times-kzm

life log

nginx.conf でURLプレフィックスでlocationディレクティブを適応したい時に気をつけること

URLのパスでルーティングの設定を分けたかったのだが、ハマったことがあった。

http://localhost/swagger というリクエストがあった場合、別のディレクトリを参照させたかった。

下記のような設定を加えていた。

<     location ^~ /swagger/ {
---
>     location /swagger/ {

どちらでもいいと思っていたが、後者の場合prefixが一致しても他の正規表現を使った locationディレクティブがあった場合そこに入ってしまう。

なぜなら正規表現を使ったlocationディレクティブのほうが優先度が高いからだ。

参考

優先順位について書かれている。

server-setting.info

例えば

下記のような設定がされているとする。

    location /swagger/ {
        alias /var/www/html/hogehoge/swagger/;
    }

    location ~ /(v.+)/ {
        # なにか
    }

このとき、 /swagger/hogehoge/xxxx.json と言ったようなルーティングはうまく動くが、 /swagger/v2/xxx.json というパスへのルーティングは、 location ~ /(v.+)/ がヒットしてそのディレクティブが適応される。

気づかなくて結構ハマった。

URLパスのprefixを優先にlocationディレクトリを適応させたい場合、 location /path/ ではなく、 location ^~ /path/ を使用したほうがいいようだ。