next up previous contents
Next: 5.3 演習 Up: 5. ロケーション Previous: 5.1.3 名前付き location

5.2 locationの例

ここでは、色々なlocation の例を見ていくことにしましょう。

# 例 5.2.1
server {
    index index.html index.htm;
    location = /  {   # config A
        root  /usr/local/www/nginx;
    }
    location / {      # config B
        root  /usr/local/www/nginx/root;
    }
    location ^~ /images/ {   # config C
        root  /usr/local/www/nginx/graph;
    }
    location ~* \.(gif|jpg|jpeg)$ {   # config D
        root  /usr/local/www/nginx/images;
    }
}

これは nginx の Wiki に載っている例です(rootディレクティブなど少し 変更しています)。

まず、URIが、/ であった場合、最初の config A がヒットしますが、 indexディレクティブにより、内部リダイレクトが起こり、/index.html に なります。これは、config B にヒットし、 /usr/local/www/nginx/root/index.html が存在すれば、これを返して終わりです。 一方、URI /images/1.gif であれば、config C にヒットします。 従って、/usr/local/www/nginx/graph/images/1.gif が返されます。 この際、既に述べましたが、URI のパスが root のパスに追加されるので 注意して下さい。 また、URI /1.gif であれば、config D にヒットします。

先に学んだ先頭一致と完全一致の関係について見て見ましょう。

# 例 5.2.2
server {
    index index.html index.htm;
    location = /  {        #config A
        root /usr/local/www/nginx;
    }
    location / {        #config B
        root /usr/local/www/nginx/root;
    }
    location = /home.html {    #config C
        root /usr/local/www/nginx/hoge;
    }
}

例5.2.2 は完全一致のURI /home.html が一致すれば config C が優先され ます。一方、/ であれば、完全一致の config A がヒットしますが、 index により、/index.html に内部リダイレクトされますので、 最終的には config B にヒットします。

# 例 5.2.3
server {
    index index.html index.htm;
    location  /doc/  {          #config A
        root /usr/local/www/nginx;
    }
    location ~ /doc/*\.html {   #config B
        root /usr/local/www/nginx/hoge;
    }
}

例 5.2.3 は、prefixがない場合の先頭一致と、正規表現の例です。 リクエスト URI が /doc/index.html であるような場合には、 config B がヒットし、/usr/local/www/nginx/hoge/doc/index.html が 返されます。一方、URI が /doc/1.jpg などの場合には、config Bが ヒットせず、そのために config A が残り、/usr/local/www/nginx/doc/1.jpg が返されます(あればの話ですが)。

# 例 5.2.4
server {
    index index.html index.htm;
    location ~ ^/doc/.*\.jpg$ {
        root /usr/local/www/nginx/my;
    }
}

例 5.2.4 は実は少し危険です。何故ならば、URI /doc/test.jpg に確かにヒットしますが、一方、URI /doc/hoge/test.jpg や URI /doc/hoge/moge/test.jpg にもヒットしてしまうからです。 このように正規表現は最長一致であるために思わぬものにもヒットして しまう可能性があります。これを /doc/ の直下のディレクトリのみにして、それ以外を禁止するには以下のように します。

# 例 5.2.5
server {
    index index.html index.htm;
    location ~ ^/doc/[^/]*\.jpg$ {  # config A
        root /usr/local/www/nginx/my;
    }
    location ~ ^/doc/.*/.*\.jpg$ {  # config B
        error_page  404  /404.html;
    }
}

ここで、config A の正規表現で、補集合 [^/] を用いていることに 注意して下さい。このために、[^/]*\.jpg は 名前に / を 含まないような全ての .jpg にマッチします。これによって、 /doc ディレクトリの下のディレクトリにアクセスするものはマッチしな いようにした上で、 そのようなディレクトリにアクセスする URI /doc/hoge/1.jpg に 対しては conifg Bにマッチするようになっています。この正規表現では、 /.*/ は最長一致ですので、/hoge/moge/hare/ のようなものに も全てマッチします。その結果、/doc/ の直下以外のディレクトリへの アクセスは、error_page によって、エラーが返ります。

ちなみに、error_page の意味は、404 エラーコードに対して、 /404.html を返すという意味です。但し、勿論、これはエラーページ を表示させるための内部リダイレクトを発生させますので、URI /404.html を処理するための location 定義が必要です。 error_page については、次の章で詳しく見ることにします。

# 例 5.2.6
server {
    index index.html index.htm;
    location ^~ /doc  { # config A
        root /usr/local/www/nginx;
    }
    location ~ ^/documents/ {  # config B
        root /usr/local/www/nginx/my;
    }
}

例 5.2.6 では、先頭一致の例ですが、今までとは異なり、URI への一致が パスの先頭だけではなく、URI /documents/index.html などにも ヒットする点にあります。このために、先頭が一致すれば、正規表現が 参照されることなく config A が適用されます。

# 例 5.2.7
server {
    index index.html index.htm;
    location /doc  { # config A
        root /usr/local/www/nginx;
    }
    location ~ ^/documents/ {  # config B
        root /usr/local/www/nginx/my;
    }
}

例 5.2.6 と似ていますが、5.2.7 では、prefix無しになっています。このために、 ヒットしますが、適用は保留され、正規表現が検索され、その結果 config Bが ヒットし、こちらが優先的に適用されることになります。

# 例 5.2.8
server {
    index index.html index.htm;
    location / {
        root /usr/local/www/nginx;
    }
    location ~ ^/doc/[^/]*\.html$ {        # config A
        root /usr/local/www/nginx/my;
    }
    location ~ ^/doc/.*\.html$ {        # config B
        root /usr/local/www/nginx/my2;
    }
}

例5.2.8 は、今度は正規表現の検索に関した例です。config A は、 URI /doc/index.html にはヒットしますが、/doc/hoge/index.html にはヒットしません。後者の場合には、config B でヒットします。ところが、 もし、これらの順序を逆にすると、config A は絶対にヒットしなくなります。 このように、正規表現を複数書く場合にはその順序に注意する必要がある訳です。



Noriyo Kanayama