Cosnomi
Cosnomi

医療×IT / 医学生 / Web(React, Flask) / 機械学習(画像認識, Keras)

Twitter / GitHub / Keybase

URLの末尾のスラッシュ(/)について trailing slashの話~Flask(Python)での扱いも交えて~

突然ですが、みなさん!

この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 は原則として異なるファイルを指すことになります。「/」の有無でここまで違うのですね。

同じデータを返す場合もある

確かに、2 つの URL の指す場所が異なることは理解できましたが、Web サイトによっては同じデータを返してくる場合もあります。これは、静的な Web サーバーではなく動的なコンテンツに多いと思います。

動的なコンテンツ(私は Python の Flask を用いた Web アプリを作ることが多いのですが)の場合は、trailing-slashにinsensitive なことが多いと思います。

Python(Flask)の場合

では、Flask の場合、trailing slash はどのように処理されるのか見ていきましょう。Quickstart - Flask にも書いてありますが、日本語で簡潔にまとめていきたいと思います。

Flask では、関数の前に URL を@app.route(“/top/piyo”)のようにデコレーターを用いて指定します。このとき”/top/piyo”と指定した場合と”/top/piyo/“と指定した場合の違いを見ていきましょう。

まず、“/top/piyo”と指定した場合、trailing slash 付き(/top/piyo/)でアクセスしたときは、404 Not Foundとなります。trailing slash 無し(/top/piyo)でアクセスしたときは勿論普通にアクセスできます

次に、“/top/piyo/”と指定した場合、trailing slash 付き(/top/piyo/)でアクセスしたときは、普通にアクセスできます。trailing slash 無し(/top/piyo)でアクセスしたときは trailing slash 付きの URL に302 リダイレクトされるようです。(つまりアクセスできる)

つまり、nsensitive にしたいのならば、Flask の場合は、内部では trailing slash 付きで書いたほうが良いということになります。私としては見た目的に、trailing slash 無しのほうが好きなのですが…

まとめ

  • trailing slash は意外と重要
  • ただし環境によっては区別しないことも有る
  • リダイレクトを用いれば insensitive に処理することができる