Cosnomi

プログラミングをする医学生。物を作ること、自動化すること、今まで知らなかったことを知ることが好き。TypeScript書いたり、Pythonで機械学習したりなど。

Twitter / GitHub / GPG key / Fediverse / My Page
TOP >

URLの末尾のスラッシュ(/)について trailing slashとFlaskでの挙動~

突然ですが、みなさん!

この2つの違いをご存知ですか?

あまり意識することのない末尾のスラッシュ(trailing slash)ですが、違う意味を保つ場合もあり大きな罠になり得ます。今回はこの2つの違いについて説明し、実例を通じて理解していきたいと思います。

末尾の「/」

パスにおけるスラッシュはディレクトリ名(フォルダ名)を区切ります。例えば、 /cosnomi/photo/0002.png などであれば、cosnomi ディレクトリの中にある photo ディレクトリの中に在る 0002.png という名前のファイルを指します。

では、末尾がスラッシュで終わっている場合、何を表すのでしょうか。多くのWebサーバーでは「/」で終わるURLに対しては「index.html」や「index.php」などのファイルを返すことになっています。

つまり、多くの場合、http://example.com/index.htmlhttp://example.com/ は同じファイルを指します。

では冒頭の例は?

では、冒頭の例、 http://example.com/hogehttp://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に処理することができる

Comments

記事一覧へ