web-dev-qa-db-ja.com

ログインページにリダイレクトするときの正しいHTTPステータスコードとは何ですか?

ユーザーがログインしておらず、ログインが必要なページにアクセスしようとした場合、ログインページへのリダイレクトの正しいHTTPステータスコードは何ですか?

W3Cによって設定された3xx応答コードseemが要件に適合しないため、私は尋ねています:

10.3.1 300複数の選択肢

要求されたリソースは、それぞれ独自の特定の場所を持つ一連の表現のいずれか1つに対応し、エージェント駆動のネゴシエーション情報(セクション12)が提供されているため、ユーザー(またはユーザーエージェント)は優先表現を選択し、その場所へのリクエスト。

HEADリクエストでない限り、応答には、ユーザーまたはユーザーエージェントが最も適切なリソース特性と場所を選択できるリソース特性と場所のリストを含むエンティティを含める必要があります。エンティティ形式Content-Typeヘッダーフィールドで指定されたメディアタイプによって指定されます。

ユーザーエージェント、最も適切な選択の選択は自動的に実行される場合があります。ただし、この仕様では、このような自動選択の標準は定義されていません。

サーバーに表現の優先選択がある場合は、その表現の特定のURIを[場所]フィールドに含める必要があります。ユーザーエージェントは、自動リダイレクトにロケーションフィールドの値を使用してもよい[MAY]。特に指定がない限り、この応答はキャッシュ可能です。

10.3.2 301恒久的に移動

要求されたリソースには新しい永続的なURIが割り当てられており、このリソースへの今後の参照では、返されたURIのいずれかを使用する必要があります。リンク編集機能を備えたクライアントは、可能な場合、サーバーから返された1つ以上の新しい参照にRequest-URIへの参照を自動的に再リンクする必要があります。特に指定がない限り、この応答はキャッシュ可能です。

新しいパーマネントURIは、応答の[場所]フィールドで指定する必要があります。要求メソッドがHEADでない限り、応答のエンティティには、新しいURIへのハイパーリンクを持つ短いハイパーテキストノートを含める必要があります。

GETまたはHEAD以外のリクエストへの応答として301ステータスコードを受信した場合、ユーザーが確認できない限り、ユーザーエージェントはリクエストを自動的にリダイレクトしてはいけません。リクエストが発行された条件を変更する可能性があるためです。

  Note: When automatically redirecting a POST request after
  receiving a 301 status code, some existing HTTP/1.0 user agents
  will erroneously change it into a GET request.

10.3.3 302見つかった

要求されたリソースは、別のURIの下に一時的に存在します。リダイレクトはときどき変更される可能性があるため、クライアントは今後のリクエストにRequest-URIを使用し続ける必要があります。この応答は、Cache-ControlまたはExpiresヘッダーフィールドで示されている場合にのみキャッシュ可能です。

一時URIは、応答の[場所]フィールドで指定する必要があります。要求メソッドがHEADでない限り、応答のエンティティには、新しいURIへのハイパーリンクを持つ短いハイパーテキストノートを含める必要があります。

GETまたはHEAD以外のリクエストに応答して302ステータスコードを受信した場合、ユーザーが確認できない限り、ユーザーエージェントは自動的にリクエストをリダイレクトしてはなりません。リクエストが発行された条件が変わる可能性があるためです。

  Note: RFC 1945 and RFC 2068 specify that the client is not allowed
  to change the method on the redirected request.  However, most
  existing user agent implementations treat 302 as if it

元のリクエスト方法に関係なく、Locationフィールド値でGETを実行する303応答でした。ステータスコード303および307は、クライアントにどのような反応が期待されるかを明確に明らかにしたいサーバーに追加されました。

10.3.4 303その他を参照

リクエストへの応答は別のURIで見つけることができ、そのリソースでGETメソッドを使用して取得する必要があります。このメソッドは主に、POSTでアクティブ化されたスクリプトの出力がユーザーエージェントを選択したリソースにリダイレクトできるようにするために存在します。新しいURIは、最初に要求されたリソースの代替参照ではありません。 303応答はキャッシュしてはいけません(MUST NOT)が、2番目の(リダイレクトされた)要求への応答はキャッシュ可能です。

異なるURIは、応答の[場所]フィールドで指定する必要があります。要求メソッドがHEADでない限り、応答のエンティティには、新しいURIへのハイパーリンクを持つ短いハイパーテキストノートを含める必要があります。

  Note: Many pre-HTTP/1.1 user agents do not understand the 303
  status. When interoperability with such clients is a concern, the
  302 status code may be used instead, since most user agents react
  to a 302 response as described here for 303.

10.3.5 304変更なし

クライアントが条件付きGET要求を実行し、アクセスが許可されているが、ドキュメントが変更されていない場合、サーバーはこのステータスコードで応答する必要があります。 304応答はメッセージ本文を含んではならないため、ヘッダーフィールドの後の最初の空行で常に終了します。

応答には、次のヘッダーフィールドを含める必要があります。

  - Date, unless its omission is required by section 14.18.1 If a

クロックレスのOriginサーバーはこれらのルールに従い、プロキシとクライアントは([RFC 2068]、セクション14.19で既に指定されているように)なしで受信した応答に独自の日付を追加し、キャッシュは正しく動作します。

  - ETag and/or Content-Location, if the header would have been sent
    in a 200 response to the same request
  - Expires, Cache-Control, and/or Vary, if the field-value might
    differ from that sent in any previous response for the same
    variant If the conditional GET used a strong cache validator (see

セクション13.3.3)、応答には他のエンティティヘッダーを含めるべきではありません。そうでない場合(つまり、条件付きGETが弱いバリデーターを使用した場合)、応答に他のエンティティヘッダーを含めることはできません。これにより、キャッシュされたエンティティボディと更新されたヘッダーの間の不整合が防止されます。

304応答が現在キャッシュされていないエンティティを示す場合、キャッシュは応答を無視して、条件なしで要求を繰り返さなければなりません。

キャッシュが受信した304応答を使用してキャッシュエントリを更新する場合、キャッシュは応答で指定された新しいフィールド値を反映するようにエントリを更新する必要があります。

10.3.6 305プロキシを使用

要求されたリソースには、Locationフィールドで指定されたプロキシを介してアクセスする必要があります。 Locationフィールドは、プロキシのURIを提供します。受信者は、プロキシを介してこの単一のリクエストを繰り返すことが期待されています。 305応答は、Originサーバーによってのみ生成される必要があります。

  Note: RFC 2068 was not clear that 305 was intended to redirect a
  single request, and to be generated by Origin servers only.  Not
  observing these limitations has significant security consequences.

10.3.7 306(未使用)

306ステータスコードは、以前のバージョンの仕様で使用されていたもので、現在は使用されておらず、予約されています。

10.3.8 307一時的なリダイレクト

要求されたリソースは、別のURIの下に一時的に存在します。リダイレクトはときどき変更される可能性があるため、クライアントは今後のリクエストにRequest-URIを使用し続ける必要があります。この応答は、Cache-ControlまたはExpiresヘッダーフィールドで示されている場合にのみキャッシュ可能です。

一時URIは、応答の[場所]フィールドで指定する必要があります。多くのHTTP/1.1以前のユーザーエージェントは307ステータスを理解していないため、リクエストメソッドがHEADでない限り、レスポンスのエンティティには新しいURIへのハイパーリンクを持つ短いハイパーテキストノートが含まれている必要があります。したがって、ノートには、ユーザーが新しいURIで元の要求を繰り返すために必要な情報を含める必要があります。

307ステータスコードがGETまたはHEAD以外のリクエストに応じて受信された場合、ユーザーが確認できない限り、ユーザーエージェントはリクエストを自動的にリダイレクトしてはなりません。リクエストが発行された条件を変更する可能性があるためです。

the正解が見つかるまで、今のところ302を使用しています。

更新と結論:

HTTP 302は、クライアント/ブラウザとの最高の互換性があることが知られているため、より優れています。

117
Vidar Vestnes

私は言うだろう 3その他を参照 2検出:

要求されたリソースは、別のURIの下に一時的に存在します。リダイレクト場合によっては変更される可能性がありますであるため、クライアントは今後のリクエストにRequest-URIを引き続き使用する必要があります(SHOULD)。この応答は、Cache-ControlまたはExpiresヘッダーフィールドで示されている場合にのみキャッシュ可能です。

私の意見では、ログインページに最も近いものです。最初は303 see otherこれも同様に機能します。少し考えてから、302 Foundは、要求されたリソースが見つかったため、より適切です。アクセスする前に別のページを通過するだけです。応答はデフォルトではキャッシュされないため、同様に問題ありません。

57
Pekka 웃

これは、HTTPリダイレクトメカニズムの誤用です。ユーザーが承認されていない場合、アプリは401 Unauthorized。ユーザーが許可されているが、要求されたリソースへのアクセス権がない場合は、403 Forbiddenを返す必要があります。

クライアント側でリダイレクトを行う必要があります。 javascriptによる。 必要な許可が存在しないため、リダイレクトのステータスコード。これに30xを使用すると、HTTPに準拠しません。

マークノッティンガムによるHTTPステータスコードについての考え方

401不正は、HTTPのリクエスト認証メカニズムをトリガーします。

401 Unauthorizedステータスコードには、WWW-Authenticateさまざまな認証タイプをサポートするヘッダー:

WWW-Authenticate:<type> realm = <realm>

Bearer、OAuth、Basic、Digest、Cookieなど

45
filip26

適切なソリューションはHTTP 401(Not Authorized)ヘッダーだと思います。

http://en.wikipedia.org/wiki/HTTP_codes#4xx_Client_Error

このヘッダーの目的はまさにこれです。ただし、ログインページにリダイレクトする代わりに、正しいプロセスは次のようになります。

  • ログインしていないユーザーがログイン制限ページにアクセスしようとしました。
  • システムはユーザーがログインしていないと識別します
  • システムはHTTP 401ヘッダーを返し、ログインフォームを同じ応答(リダイレクトではなく)で表示します。

これは、サイトマップリンクや検索フォームなどを備えた便利な404ページを提供するなどの良い習慣です。

またね。

12
Dave