\ お問い合わせはこちら! /

【完全版】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 が正解 です。

Django のリダイレクト実装方法(最小コード)

基本のリダイレクト(302)

Python
from django.shortcuts import redirect

def old_view(request):
    return redirect('/new-url/')

● 301 リダイレクト

Python
return redirect('/new-url/', permanent=True)

または、次のコードでもOKです。

Python
return redirect('/new-url/', status=301)

pkからslug に移行方法

1. pk を受け取って slug に転送する view

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

2. urls.py に2つの URL を用意

Python
urlpatterns = [
    path('parks/<int:pk>/', park_redirect_view, name='park_redirect'),
    path('parks/<slug:slug>/', park_detail, name='park_detail'),
]

補足1: slug が後で変わる可能性がある場合の運用

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

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

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

Python
return redirect('park_detail', slug=park.slug, status=302)

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

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

この記事が気に入ったら
フォローしてね!

シェア・記事の保存はこちら!

この記事を書いた人

CFXLOGのアバター CFXLOG プログラマ

メイン言語はPython。本ブログでは、実務や普段の学習で学んだことをアウトプットしています。
基本情報技術者試験合格者。

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)