これは主に、HTTP 仕様を解釈する最善の方法についての哲学的な質問です。ディレクトリ インデックスのないディレクトリ (index.html など) は 404 または 403 を返す必要がありますか? (403 は Apache のデフォルトです。)
たとえば、次の URL が存在し、アクセス可能であるとします。
http://example.com/files/file_1/
http://example.com/files/file_2/
しかし、何もありません:
http://example.com/files/
(301 を使用して、すべての URL の末尾にスラッシュを強制すると仮定します。)
いくつかのことを考慮に入れる必要があると思います:
- デフォルトでは、Apache はこのシナリオで 403 を返します。それは私にとって重要です。彼らはこのことについて考え、403 を使用することを決定しました。
- W3C によると、403 は「サーバーは要求を理解しましたが、それを実行することを拒否しています」を意味します。URL が意味のあるものであるにもかかわらず禁止されている場合は、403 を返す必要があるという意味だと思います。
- 403 は、URL がディスク上の実際のディレクトリにマップされていることをクライアントが正しく推測した場合、情報漏えいにつながる可能性があります。
http://example.com/files/
はリソースではなく、内部的にディレクトリにマップされているという事実は、ステータス コードとは関係ありません。- URL スキームをクライアントの観点からディレクトリ構造を定義するものと解釈すると、内部実装は依然として無関係ですが、おそらく外観はステータス コードに何らかの影響を与えるはずです。おそらく、内部でディレクトリを使用せずに同じ URL 構造を作成したとしても、403 を使用する必要があります。これは、ディレクトリ構造に対するクライアントの認識に関するものだからです。
バランスのとれた最善のアプローチは何だと思いますか? 「リソースはリソースであり、存在しない場合は 404 である」と言うべきでしょうか? それとも、「スラッシュがある場合、クライアントにはディレクトリのように見えるため、インデックスがない場合は 403 になります」と言うべきでしょうか?
あなたが 403 陣営にいる場合、たとえ内部実装がディレクトリを使用していなくても、わざわざ 403 を返すべきだと思いますか? たとえば、次の URL を持つ動的 Web アプリがあるとします:http://example.com/users/joe
は、Joe のプロファイル ページを生成するコードにマップされます。すべてのユーザーを一覧表示するものを作成していないと仮定すると、http://example.com/users/
403 を返す必要がありますか? (この場合、すべてではないにしても多くの Web フレームワークが 404 を返します。)