Przekierowania adresów URL w Django

Jeśli tworzymy nową wersję istniejącej już witryny, może pojawić się potrzeba aby przekierować stare linki na nowe adresy. Jest to ważne z perspektywy SEO, szczególnie jeśli portal który tworzymy jest rozbudowany i posiada wiele treści.

Z pomocą przychodzi nam pakiet redirects – raczej mało znana, jednak nadal istniejąca w django paczka, powalająca obsługiwać i dodawać przekierowania adresów.

Co będzie nam potrzebne?

Na początek, wymagana jest framework „sites” oraz wspomniana paczka redirects. Obydwie rzeczy musimy umieścić w settingach w sekcji INSTALLED_APPS oraz zadeklarować wartość SITE_ID.

INSTALLED_APPS = [
    # Reszta pakietów
    "django.contrib.sites",
    "django.contrib.redirects"
]

SITE_ID = 1

Nastepnie w sekcji MIDDLEWARE dodać na końcu (to ważne) „django.contrib.redirects.middleware.RedirectFallbackMiddleware”

MIDDLEWARE = [
    # Reszta pakietów
    "django.contrib.redirects.middleware.RedirectFallbackMiddleware"
]

Następnie uruchomić migracje:

$ python manage.py migrate

Gotowe 😉 Teraz po zalogowaniu się do panelu administracyjnego, pojawi się sekcja „Redirects” w której możesz podać starą ścieżkę oraz nową ścieżkę. Wszystkie przekierowania domyślnie są wykonywane z kodem 301 (Moved Permanently) lub 410 (Gone) jeśli wprowadziliśmy tylko starą ścieżkę a nie uzupełniliśmy nowej.

A co jeśli chce zrobić przekierowanie z kodem 302?

Możesz chcieć najpierw przetestować, czy przekierowania działają poprawnie, dlatego bezpieczniejsze byłoby utworzenie przekierowań z kodem 302. Aby to zrobić należy utworzyć klasę, która dziedziczy po RedirectFallbackMiddleware w następujący sposób.

from django.contrib.redirects.middleware import RedirectFallbackMiddleware
from django.http import HttpResponseRedirect


class CustomRedirectFallbackMiddleware(RedirectFallbackMiddleware):
    response_redirect_class = HttpResponseRedirect

Teraz wystarczy, że użyjemy naszej klasy, podając ją w settingach w sekcji MIDDLEWARE – przykładowo

MIDDLEWARE = [
    # Reszta pakietów
    "myapp.middleware.CustomRedirectFallbackMiddleware"
]

Photo by kaleb tapp on Unsplash