9

これは主に、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 を返します。)

4

2 に答える 2

8

これに答える最初のステップは、RFC 2616: HTTP/1.1を参照することです。具体的には、 403 Forbidden404 Not Foundについて話しているセクションです。

  • 10.4.4 403 禁止

サーバーは要求を理解しましたが、要求を満たすことを拒否しています。承認は役に立たず、要求を繰り返すべきではありません。リクエスト メソッドが HEAD ではなく、サーバーがリクエストが実行されなかった理由を公開したい場合、拒否の理由をエンティティに記述する必要があります。サーバーがこの情報をクライアントに提供したくない場合は、代わりにステータス コード 404 (Not Found) を使用できます。

  • 10.4.5 404が見つかりません

サーバーは Request-URI に一致するものを見つけられませんでした。状態が一時的なものか永続的なものかは示されていません。410 (Gone) ステータス コードは、古いリソースが永続的に利用できず、転送アドレスがないことを内部的に構成可能なメカニズムを通じてサーバーが認識している場合に使用する必要があります。このステータス コードは、サーバーが要求が拒否された理由を正確に明らかにしたくない場合、または他の応答が適用できない場合に一般的に使用されます。

これについての私の解釈は、404 は「何もない」というより一般的なエラー コードであるということです。403 は、「そこには何もありません。再試行しないでください!」と言っています。

明示的なインデックス ファイルのないディレクトリで Apache が 403 を返す理由の 1 つは、自動インデックス作成 (つまり、ディレクトリ内のすべてのファイルの一覧表示) が無効になっている (別名「禁止」) ことです。その場合、「このディレクトリ内のすべてのファイルをリストすることは禁止されています」と言う方が、「ディレクトリがありません」と言うよりも理にかなっています。

于 2011-02-22T08:22:14.563 に答える
2

404 が望ましいもう 1 つの理由は、Google ウェブマスター ツールです。

実際、404 の場合、Google Webmaster Tool はリファラーを表示します (ディレクトリへの不適切なリンクをクリーンアップできます) が、403 の場合は表示されません。

于 2012-02-18T23:40:26.627 に答える