locationでパス制御

URL の一部だけ、別の扱いにしたい

前の回で書いた server ブロックは、サイト全体をひとつのディレクトリから配信していました。ところが実際の運用では、一部の URL だけ別扱いにしたい場面が出てきます。画像だけ別のディスクから出す、古い記事だけ保管庫から出す、といった要求です。

それを担うのが location です。

server { listen 8081; root /var/www/mysite; location /works/ { alias /var/www/works-archive/; } }

location /works/ は「URL が /works/ で始まるリクエストは、このかっこの中の指示に従う」という意味です。書いていない URL は、外側の root がそのまま使われます。

root と alias の違いは、必ず一度つまずく

配信元を指定する書き方が2つあります。動きが違うので、ここは丁寧に見てください。

root は、指定したディレクトリに URL のパスを足します

location /works/ { root /var/www/archive; } # /works/a.html -> /var/www/archive/works/a.html

alias は、location に書いたパスの部分を、指定したディレクトリに置き換えます

location /works/ { alias /var/www/works-archive/; } # /works/a.html -> /var/www/works-archive/a.html

狙ったファイルが見つからず 404 になるとき、原因のほとんどがこの取り違えです。パスが二重になっていないか、nginx -T で確かめる癖をつけてください。

なお alias を使うときは、location と alias の両方を必ずスラッシュで終わらせます。片方だけスラッシュが無いと、意図しない場所を指します。

一致のしかたには順番がある

リクエストが来たとき、nginx は書いてある location をすべて見て、どれを使うかを選びます。基本は「最も長く一致したもの」が勝ちます。

location / { ... } location /works/ { ... }

/works/index.html は両方に一致しますが、長いほうの /works/ が選ばれます。location / は、どれにも当てはまらなかったときの受け皿になります。

完全一致や正規表現による指定もありますが、まずは「長いほうが勝つ」を押さえておけば、日常の設定は書けます。

手を動かす

制作物のページだけを、別のディレクトリから配信するようにします。トップページはこれまでどおり出続けることも同時に確かめます。

ヒント

  • 1. mkdir -p /var/www/works-archive で置き場所を作る
  • 2. その中に index.html を作り、制作物アーカイブ という語を含めておく
  • 3. mysite.conf の server ブロックに location /works/ を足し、alias で新しい置き場所を指す
  • 4. nginx -t のあと systemctl reload nginx で反映する
  • 5. curl で /works/ とトップページの両方を確かめる

5 項目で採点します