突然ですが、みなさん!
この2つの違いをご存知ですか?
あまり意識することのない末尾のスラッシュ(trailing slash)ですが、違う意味を保つ場合もあり大きな罠になり得ます。今回はこの2つの違いについて説明し、実例を通じて理解していきたいと思います。
末尾の「/」
パスにおけるスラッシュはディレクトリ名(フォルダ名)を区切ります。例えば、 /cosnomi/photo/0002.png
などであれば、cosnomi
ディレクトリの中にある photo
ディレクトリの中に在る 0002.png
という名前のファイルを指します。
では、末尾がスラッシュで終わっている場合、何を表すのでしょうか。多くのWebサーバーでは「/」で終わるURLに対しては「index.html」や「index.php」などのファイルを返すことになっています。
つまり、多くの場合、http://example.com/index.html
と http://example.com/
は同じファイルを指します。
では冒頭の例は?
では、冒頭の例、 http://example.com/hoge
と http://example.com/hoge/
はどうでしょうか。
前者はルートディレクトリ(公開エリアの入り口みたいなところ)にあるhogeというファイル(拡張子なしのファイルとみなされる)を表すのに対して、後者はルートディレクトリにあるhogeディレクトリの中にあるindex.htmlなどのファイルを指します。
つまり、2つのURLは原則として異なるファイルを指すことになります。
同じデータを返す場合もある
しかし、Webサイトによってはこの違いにこだわらないものもあります。特に静的なファイルをそのまま返すのではなく、APIサーバーのようにデータを返すようなサーバーでは、2つを同じルートだと見ることもあります。
Python(Flask)の場合
では、Flaskの場合、trailing slashはどのように処理されるのか見ていきましょう。
Flaskでは、関数の前にURLを @app.route("/top/piyo")
のようにデコレーターを用いて指定します。このとき /top/piyo
と指定した場合と /top/piyo/
と指定した場合の違いを見ていきましょう。
app.routeに /top/piyo
と指定した場合、ユーザーがtrailing slash付き(/top/piyo/)でアクセスしたときは、404 Not Foundとなります。trailing slash無し(/top/piyo)でアクセスしたときは勿論普通にアクセスできます。
次に、app.routeに /top/piyo/
と指定した場合、ユーザーがtrailing slash付き(/top/piyo/)でアクセスしたときは、普通にアクセスできます。trailing slash無し(/top/piyo)でアクセスしたときはtrailing slash付きのURLに302リダイレクトされるようです。(つまりアクセスできる)
つまり、trailing slashについてinsensitiveにしたいのであれば、app.routeはtrailing slash付きで書いたほうが良いということになります。見た目としては、trailing slash無しのほうが好きですけどね。
まとめ
- trailing slashは意外と重要
- ただし環境によっては区別しないことも有る
- リダイレクトを用いればinsensitiveに処理することができる