ランディング時にユーザーの物理的な場所を検出し、ユーザーに最も適したページにリダイレクトする Web ページがあります。
このリダイレクトにはどの HTTP ステータス コードを使用する必要がありますか?
ランディング時にユーザーの物理的な場所を検出し、ユーザーに最も適したページにリダイレクトする Web ページがあります。
このリダイレクトにはどの HTTP ステータス コードを使用する必要がありますか?
成功したコンテンツ ネゴシエーションの適切な応答ステータス コードは、リダイレクトが永続的なものか一時的なものかに応じて、 301、302、または307のいずれかです。
ただし、いずれにせよ、サーバー主導のネゴシエーションでは、決定がどの情報に基づいているかを常に示す必要があります。HTTP では、このプロセスで使用された要求ヘッダー フィールドのリストを指定するのはVary応答ヘッダー フィールドです。
残念ながら、クライアントの IP アドレス (それらを地理位置情報に変換していると思います) は、ここではオプションではありません。したがって、応答をキャッシュしないように指定しない限り、永続的なリダイレクトもオプションではありません。そうしないと、クライアントまたは中間プロキシによってキャッシュされる可能性があります。したがって、302 または 307 のいずれかを使用します。
リクエスタが使用するURIがあり、リダイレクトなしで同じ場所に到達できる場合、新しい場所のURIを使用する必要があるため、303は( sjstrutt が回答したように)意味があります。そうでない場合、302 は私には理にかなっています。なぜなら、他の方法で要求できる URI のない場所にリダイレクトすることになるため、将来の要求には引き続き Request-URI を使用する必要があるからです。
w3.orgが 302 ステータス コードについて述べていることは次のとおりです。
10.3.3 302 見つかりました
要求されたリソースは、一時的に別の URI に存在します。 リダイレクトは場合によって変更される可能性があるため、クライアントは今後のリクエストに対して引き続き Request-URI を使用する必要があります。この応答は、Cache-Control または Expires ヘッダー フィールドで示されている場合にのみキャッシュ可能です。
一時的な URI は、応答の Location フィールドで指定する必要があります。リクエスト メソッドが HEAD でない限り、レスポンスのエンティティには、新しい URI へのハイパーリンクを含む短いハイパーテキスト ノートを含める必要があります。
GET または HEAD 以外のリクエストに応答して 302 ステータス コードを受信した場合、ユーザーが確認できない限り、ユーザー エージェントはリクエストを自動的にリダイレクトしてはなりません。これにより、リクエストが発行された条件が変更される可能性があるためです。
...
鉱山を強調します。
余談ですが、CodeIgniter のredirect()
関数のデフォルトは 302 ですが、検索エンジンのリダイレクトには 301 が使用される可能性があると言及されています。明らかにそれは彼らの決定でしたが、それは広く使用されている Web フレームワークであり、彼らはそれにいくつかの考えを入れていると思います。
HTTP 1.1 より前のクライアントとは互換性がないかもしれませんが、おそらく HTTP 303 がこのような状況に最も適したステータス コードだと思います。
HTTP 303ステータス コードには次のように記載されています (注: 最も重要と思われる部分を太字にしています) 。このメソッドは主に、POST でアクティブ化されたスクリプトの出力がユーザー エージェントを選択したリソースにリダイレクトできるようにするために存在します。新しい URI は、最初に要求されたリソースの代替参照ではありません。303 応答はキャッシュしてはなりませんが、2 番目の (リダイレクトされた) 要求に対する応答はキャッシュ可能かもしれません。