- URL 設計を途中で変更したい
/old/から/new/に誘導したいpkURL をslugにリプレースしたい
Webアプリを運用していると、こんな場面は必ず出てきます。
そのときに重要なのが HTTP リダイレクト(301 / 302 / 307 / 308)。
本記事では、Django でどのリダイレクトを使うべきかの判断基準と、実装方法を分かりやすくまとめました。
Contents
リダイレクトの種類と使い分け(判断基準)
まずは結論から。
| 種類 | 何が起こる? | 使うべきケース |
|---|---|---|
| 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) # 3012. 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に切り替えるといった順番です。

コメント