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.htmlalias は、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 / は、どれにも当てはまらなかったときの受け皿になります。
完全一致や正規表現による指定もありますが、まずは「長いほうが勝つ」を押さえておけば、日常の設定は書けます。
手を動かす
制作物のページだけを、別のディレクトリから配信するようにします。トップページはこれまでどおり出続けることも同時に確かめます。