next up previous contents
Next: 6.3.2 優先順位 Up: 6.3 サーバー名 Previous: 6.3 サーバー名

6.3.1 ワイルドカードと正規表現

名前に基づくバーチャルサーバにおいて、名前はワイルドカード(*) や 正規表現によって表現することが出来るので、その優先順位がやはり問題と なります。

まず、ワイルドカードと正規表現の例を見て見ましょう。

    server {
        server_name  *.test.jp  www.test.*;
    ...
    }

上の場合、ワイルドカードが前についたものと後ろについたものが併記されて います。前についたワイルドカードは省略もできます。

    server {
        server_name  .test.jp;
        ...
    }

一方、ワイルドカードのみは許されていませんので注意して下さい。

# エラーになる例
    server {
        server_name  *;
        ...
    }

正規表現はチルダ( $\scriptstyle\mathtt{\sim}$)を、正規表現の前に置くことで表します。

    server {
        server_name  ~^www[0-9]+\.test\.jp$;
        ...
    }

なお、チルダ( $\scriptstyle\mathtt{\sim}$) と正規表現の間に空白を置くと、エラーに なるので、注意して下さい。勿論、ドット(.) はエスケープ するのを忘れてはいけません。

また、正規表現ですので、部分一致する可能性がありますので、上の ように、~$ で明示的に囲んだ方が良いでしょう。

    server {
        server_name  ~^(www[0-9]+)\.test\.jp$;
        location / {
             root  /usr/local/nginx/$1;
        }
    }

上の例は少し面白い使い方で、多くのサーバブロックを書く代わりに、 一つのサーバブロックで代用できています。もし、www2.test.jp への アクセスであったならば、ディレクトリ /usr/local/nginx/www2 以下 が root として利用される訳です。勿論、DNSなどにこれらの名前が登録されて いなければなりません。

$1などの標準の変数では困る場合(複数の正規表現とのマッチを行う場合)、 名前付き変数へのキャプチャが可能です。

    server {
        server_name  ~^(?<domain>www[0-9]+)\.test\.jp$;
        location / {
            root  /usr/local/nginx/$domain;
        }
    }

名前付き変数へのキャプチャの構文は次のようになります。

名前付き変数キャプチャ  
  (?<var-name>reg-exp)
  (?'var-name'reg-exp)
  (?P<var-name>reg-exp)

ここで、var-name が一致した文字列を代入する変数名で、 reg-exp が正規表現です。キャプチャされるのは、グループ指定 された( ( )でくくられた)範囲です。 3つの表現は全て同じで、PCRE-7.0 では全てサポートされています。 もし、pcre_compile() failed: などが出る場合には、PCREが古い ためで、ライブラリを新しくするか、または3番目の表現を利用する必要が あります。

この名前付き変数の利用に当たっては、nginx の組み込み変数名などとの衝突 に注意する必要があります。



Noriyo Kanayama