# Django 5.2.9 ドキュメント

# redirects （リダイレクト）アプリ

Django にはオプションで redirects (リダイレクト) アプリケーションが付属しています。リダイレクトをデータベースに保存し、リダイレクトを処理します。デフォルトでは HTTP 応答ステータスコード `301 Moved Permanently` を使います。

## インストール

redirects アプリをインストールするには、以下の手順に従ってください:

1. `django.contrib.sites` フレームワークが インストールされていること を確認してください。

2. `'django.contrib.redirects'` を `INSTALLED_APPS` 設定に追加します。

3. `MIDDLEWARE` 設定に `'django.contrib.redirects.middleware.RedirectFallbackMiddleware'` を追加します。

4. コマンド `manage.py migrate` を実行します。

## しくみ

`manage.py migrate` はデータベースに `django_redirect` テーブルを作成します。これは、 `site_id`、 `old_path`、および `new_path` フィールドを持つルックアップテーブルです。

`RedirectFallbackMiddleware` が全ての作業を担当しています。Djangoアプリケーションが404エラーを発生させるたびに、このミドルウェアは要求されたURLが最終手段としてリダイレクトデータベースをチェックします。具体的には、与えられた `old_path` とサイトIDが `SITE_ID` 設定に対応するリダイレクトを確認します。

- 一致するものが見つかり、かつ `new_path` が空でない場合、301 ("Moved Permanently") リダイレクトで `new_path` にリダイレクトします。 `RedirectFallbackMiddleware` をサブクラス化し、 `response_redirect_class` を `django.http.HttpResponseRedirect` に設定して、 `302 Moved Temporarily` リダイレクトを代わりに使用できます。

- 一致するものが見つかり、 `new_path` が空であれば、410 ("Gone") HTTPヘッダーと空の (content-less) レスポンスを送信します。

- マッチするものが見つからない場合は、リクエストは通常通り処理されます。

ミドルウェアは、404 エラーにのみアクティブ化され、500 エラーや他のステータスコードのレスポンスには適用されません。

`MIDDLEWARE` の順番は重要であることに注意してください。一般的に、 `RedirectFallbackMiddleware` をリストの最後に置くべきです。それは最終手段として機能します。

ミドルウェアについての詳細は ミドルウェアのドキュメント を参照してください。

## リダイレクトの追加、変更、削除方法

### admin インターフェイス経由

Django の自動管理インターフェイスを有効にしていれば、管理インデックスページに "Redirects" セクションがあるはずです。システムの他のオブジェクトを編集するように、リダイレクトを編集してください。

### Python API 経由

class models.Redirect

  リダイレクトは標準の Django モデル で表現され、 django/contrib/redirects/models.py にあります。 リダイレクトオブジェクトには、DjangoデータベースAPI を経由してアクセスできます。たとえば:

      >>> from django.conf import settings
      >>> from django.contrib.redirects.models import Redirect
      >>> # Add a new redirect.
      >>> redirect = Redirect.objects.create(
      ...     site_id=1,
      ...     old_path="/contact-us/",
      ...     new_path="/contact/",
      ... )
      >>> # Change a redirect.
      >>> redirect.new_path = "/contact-details/"
      >>> redirect.save()
      >>> redirect
      <Redirect: /contact-us/ ---> /contact-details/>
      >>> # Delete a redirect.
      >>> Redirect.objects.filter(site_id=1, old_path="/contact-us/").delete()
      (1, {'redirects.Redirect': 1})

## ミドルウェア

class middleware.RedirectFallbackMiddleware

  ミドルウェアが使用する `HttpResponse` クラスは、 `RedirectFallbackMiddleware` のサブクラスを作成し、 `response_gone_class` や `response_redirect_class` をオーバーライドすることで変更できます。

  response_gone_class

    要求されたパスが見つからないか、`new_path` に空の値が含まれている時に、 `Redirect` が見つからないときに使用される `HttpResponse` クラス。

    デフォルトは `HttpResponseGone` です。

  response_redirect_class

    リダイレクトを処理する `HttpResponse` クラス。

    デフォルトは `HttpResponsePermanentRedirect` です。