Trailing Slash

いつものように個人的なメモ
nginxのメモばかり増えていく
Trailing SlashとはURLの末尾につける「/」、その設定方法

目的

nginxでTrailingSlashを付与する設定
その際に特定のパスはTrailingSlashを付けない、付けるの判断をする

テスト

0. テスト環境

パス構成を下記の様に想定
テスト時に存在しない /example/ccc と /example/aaa/bar.png を使用する

.
└── example
    ├── aaa
    │   ├── foo
    │   ├── hoge.jpg
    │   └── index.html
    ├── bbb
    │   ├── foo
    │   ├── hoge.jpg
    │   └── index.html
    └── index.html

1. 全部 / を付与する

nginx.conf


rewrite ^(.*[^/])$ $1/ permanent;

全URLに / が付与されるので index.html も index.html/ になる
hoge.jpg なども hoge.jpg/ となり404になる
存在しない /ccc や /aaa/bar.png などにアクセスしても /ccc/ や /aaa/bar.png/ となる

2. .jpg等の拡張子・ファイルには付けない

nginx.conf

rewrite ^([^.]+[^/])$ $1/ permanent;

index.html などはそのまま
hoge.jpg などもそのままになる
/aaa や /bbb/foo にアクセスすると /aaa/ や /bbb/foo/ となる
存在しない ccc などにアクセスしても /ccc/ となる
/aaa/bar.png へアクセスした際は hoge.jpg と同じように / 無しで /aaa/bar.png のまま

3. 一部のみ除外したい場合

nginx.conf


if ( $request_uri ~ "/aaa" ) {
   set $not_ignore false;
}
if ($not_ignore != false ) {
  rewrite ^([^.]+[^/])$ $1/ permanent;
}

/aaa/hoge.jpg はそのまま
/aaa/foo もそのままで/はつかない
/bbb/hoge.jpg はそのまま
/bbb/foo は /bbb/foo/ となる
/ccc/foo は /ccc/foo/ , /aaa/bar.png は /aaa/bar.png といった形になる

まとめ

3のように $request_uriでマッチさせてフラグを立てると行った形にしている。
locationに記載するrewrite条件で記載できるのだろうが、複雑化する可能性が高く追加が手間なのでフラグを使う

参考:
ScaleScale Tips/Nginx

元記事はこちら

NginxによるTrailingSlashのメモ