HTTPQUERY
日本語

308 Permanent Redirect

使い方

308 Permanent Redirect ステータスコードを受け取ったとき、クライアントは保存しているリンクを新しい URI に更新することが期待されます。新しい URI は Location ヘッダーで指定され、クライアントによる自動リダイレクトに使われます。

このレスポンスは、サーバーが新しいドメインへ移行する場合や、以前の URI に戻す予定なく内部のファイル構造を再編成する場合によく使われます。

308 Permanent Redirect ステータスコードは、1つの決定的な点で 301 と異なります。クライアントは元のリクエストメソッドを保持することが求められます。301 レスポンスは、リダイレクトの際にクライアントが POST リクエストを GET リクエストへ変更することを認めます。308 Permanent Redirect は、後続のリクエストが元と同じメソッドを使うことを要求します。そのため、API エンドポイントやフォーム送信のようにメソッドの保持が重要な場合、308 が正しい選択となります。308 ステータスコードは当初、独立した仕様として定義されたのち、HTTP の中核標準に取り込まれました。

SEO への影響

Google は 308 を 301 とまったく同じように扱います。どちらも恒久的なリダイレクトであり、リダイレクト先が正規であるという強いシグナルです。ランキングシグナルは古い URL から新しい URL へ移転します。Google はリダイレクトを最大 10 ホップまで辿ります。中間のリダイレクト URL のコンテンツは無視されます。301 と 308 の唯一の違いはメソッドの保持であり、これは API エンドポイントでは重要ですが、検索エンジンのクロールには関係ありません。削除された URL を 308 でホームページや汎用のカテゴリページへリダイレクトすると、Google にソフト 404 として検出されます。

例

クライアントが API エンドポイントへ POST リクエストを送信します。サーバーは、そのエンドポイントが移動したことを示すために 308 Permanent Redirect で応答します。クライアントは、元のボディを含む POST リクエストを新しい Location で繰り返すことが求められます。

リクエスト

POST /api/v1/orders HTTP/1.1
Host: example.com
Content-Type: application/json
Content-Length: 35

{"item": "widget", "quantity": 10}

レスポンス

HTTP/1.1 308 Permanent Redirect
Location: http://example.com/api/v2/orders
Content-Type: text/html; charset=UTF-8
Content-Length: 118

<h1>API endpoint moved</h1>
<body>
The orders endpoint has moved to
<a href=/api/v2/orders>/api/v2/orders</a>.
</body>

コードリファレンス

.NET

HttpStatusCode.PermanentRedirect

Rust

http::StatusCode::PERMANENT_REDIRECT

Rails

:permanent_redirect

Go

http.StatusPermanentRedirect

Symfony

Response::HTTP_PERMANENTLY_REDIRECT

Python3.5+

http.HTTPStatus.PERMANENT_REDIRECT

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_PERMANENT_REDIRECT

Angular

@angular/common/http/HttpStatusCode.PermanentRedirect