正確には、コンテキストには以下の6種類があります。
継承では、必ず上位から下位に継承なされ、同位のものに継承が行われることや、 上位に影響することはありません。
これを、以下の例で見て見ましょう。
server { server_name hoge; root /home/pub; location /app { root /usr/www; } location /app2 { } } |
ここで、Apache ではシステム上のファイルや、ディレクトリが対象で、 それらがURLに対してどのような位置づけになるかが記述されますが、 nginx では URL が常にその対象となる点を覚えておいて下さい。
まず、nginx での root は、Apache の DocumentRoot に相当します。 そういう意味では、root は nginx にあっては少し特殊なディレクティブに なり、与えられたURLに対して、どのディレクトリからその対象を探すかという ことを定義します。
上の例では、 server ブロックに root /home/pub
がありますので、
これがそれぞれの location ブロックに継承されますが、location /app
ブロックでは、これをオーバーライドして root /usr/www
に変更して
いますので、location /app
の root は /usr/www
で、
一方、location /app2
では root は /home/pub
になります。
以上のことから、http://hoge/app/index.html
は
/usr/www/app/index.html
にヒットし、
http://hoge/app2/index.html
は
/home/pub/app2/index.html
にヒットする訳です。
但し、action ディレクティブはオーバーライドせずに、両方が実行されます。 action ディレクティブの代表が rewrite ですが、これは後で取り上げます。
一方、location ブロックは、入れ子にすることも可能です。
server { location / { index index.html; location ~ \.php$ { index index.php; } } } |
あまり意味のない例ですが、内部の location は正規表現で指定しており、
拡張子が .php
が指定されているURLにマッチします。