【完全版】Djangoで使うリダイレクトの種類と判断基準・実装方法まとめ

  • URL 設計を途中で変更したい
  • /old/ から /new/ に誘導したい
  • pk URL を slug にリプレースしたい

Webアプリを運用していると、こんな場面は必ず出てきます。

そのときに重要なのが HTTP リダイレクト(301 / 302 / 307 / 308)

本記事では、Django でどのリダイレクトを使うべきかの判断基準と、実装方法を分かりやすくまとめました。

まずは結論から。

種類何が起こる?使うべきケース
301 (Moved Permanently)永続的に新URLが正しいと扱われる。検索エンジンも更新。URL 構造を正式に変えたいとき/SEO 継承したいとき
302 (Found)一時的な移動。テスト中/一時変更/将来 URL が変わる可能性がある
307 (Temporary Redirect)一時的・HTTP メソッド保持。POST → POST のままリダイレクトしたい場合
308 (Permanent Redirect)永続・HTTP メソッド保持。POST を壊さず永久移動したい特殊ケース
  • 恒久的な URL 変更 → 301
  • 一時的な変更・slug 試験運用 → 302

特に スパラメータをpkからslugに変更した場合は、SEO対策から言っても 301 が正解 です。

Python
from django.shortcuts import redirect

def old_view(request):
    return redirect('/new-url/')
Python
return redirect('/new-url/', permanent=True)
Python
from django.shortcuts import get_object_or_404, redirect
from .models import Park

def park_redirect_view(request, pk):
    park = get_object_or_404(Park, pk=pk)
    return redirect('park_detail', slug=park.slug, permanent=True)  # 301
Python
urlpatterns = [
    path('parks/<int:pk>/', park_redirect_view, name='park_redirect'),
    path('parks/<slug:slug>/', park_detail, name='park_detail'),
]

slug が不安定な場合には、次のようにします。

  • 初期 → 302(キャッシュされない)
  • 安定したら → 301

例えば、以下のようなコードになります。

Python
return redirect('park_detail', slug=park.slug)  # permanent未指定なら302

slug が変わる前提なのにいきなり 301すると、ブラウザや Google が永続キャッシュしてしまってURL が変わらなくなる問題が発生します。

運用としては、まず302リダイレクトをする。slugがちゃんと決まったら301に切り替えるといった順番です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

普段は主にPython開発をしています。
最近はAI駆動開発にも関わっています。

コメント

コメントする