---
title: "重定向应用"
version: 5.0
locale: zh-hans
source: https://docs.djangoproject.com/zh-hans/5.0/ref/contrib/redirects/
canonical: https://djangodocs.dev/zh-hans/5.0/ref/contrib/redirects/
---
# 重定向应用

Django 自带了一个可选的重定向应用程序。它可以让你在数据库中存储重定向，并为你处理重定向。它默认使用 HTTP 响应状态码 `301 Moved Permanently`。

## 安装

要安装重定向应用程序，请按照这些步骤进行：

1. 确保 `django.contrib.sites` 框架 [已安装](/zh-hans/5.0/ref/contrib/sites/#enabling-the-sites-framework)。
2. 将 `'django.contrib.redirects'` 添加到你的 [`INSTALLED_APPS`](/zh-hans/5.0/ref/settings/#std-setting-INSTALLED_APPS) 配置中。
3. 在你的 [`MIDDLEWARE`](/zh-hans/5.0/ref/settings/#std-setting-MIDDLEWARE) 配置中添加 `'django.contrib.redirects.middleware.RedirectFallbackMiddleware'`。
4. 运行命令 [`manage.py migrate`](/zh-hans/5.0/ref/django-admin/#django-admin-migrate)。

## 工作方式

`manage.py migrate` 在数据库中创建一个 `django_redirect` 表。这是一个有 `site_id`、`old_path` 和 `new_path` 字段的查询表。

[`RedirectFallbackMiddleware`](#django.contrib.redirects.middleware.RedirectFallbackMiddleware) 完成了所有的工作。每当任何 Django 应用出现 404 错误时，这个中间件都会检查重定向数据库中请求的 URL，作为最后的手段。具体来说，它检查给定的 `old_path` 与站点 ID 对应的 [`SITE_ID`](/zh-hans/5.0/ref/settings/#std-setting-SITE_ID) 设置的重定向。

- 如果它找到了一个匹配的对象，并且 `new_path` 不是空的，它就会使用 301（“Moved Permanently”）重定向到 `new_path`。你可以将 [`RedirectFallbackMiddleware`](#django.contrib.redirects.middleware.RedirectFallbackMiddleware) 子类化，并将 [`response_redirect_class`](#django.contrib.redirects.middleware.RedirectFallbackMiddleware.response_redirect_class) 设置为 [`django.http.HttpResponseRedirect`](/zh-hans/5.0/ref/request-response/#django.http.HttpResponseRedirect) 以使用 `302 Moved Temporary` 重定向。
- 如果它找到了一个匹配，并且 `new_path` 是空的，它就会发送一个 410（“Gone”）HTTP 头和空的（无内容）响应。
- 如果没有找到匹配的请求，则继续照常处理。

中间件只有在 404 时才会被激活——而不是 500 或任何其他状态码的响应。

注意 [`MIDDLEWARE`](/zh-hans/5.0/ref/settings/#std-setting-MIDDLEWARE) 的顺序很重要。一般来说，你可以把 [`RedirectFallbackMiddleware`](#django.contrib.redirects.middleware.RedirectFallbackMiddleware) 放在列表的最后，因为这是最后的手段。

关于中间件的更多内容，请阅读 [中间件文档](/zh-hans/5.0/topics/http/middleware/)。

## 如何添加、更改和删除重定向

### 通过管理界面

如果你已经激活了 Django 的自动管理界面，你应该会在管理索引页上看到“重定向”部分。像编辑系统中的其他对象一样编辑重定向。

### 通过 Python API

#### `class models.Redirect`

重定向由一个标准的 [Django 模型](/zh-hans/5.0/topics/db/models/) 表示，位于 [django/contrib/redirects/models.py](https://github.com/django/django/blob/stable/5.0.x/django/contrib/redirects/models.py) 中。您可以通过 [Django 数据库 API](/zh-hans/5.0/topics/db/queries/) 访问重定向对象。例如：

```pycon
>>> 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`

你可以通过创建一个 [`RedirectFallbackMiddleware`](#django.contrib.redirects.middleware.RedirectFallbackMiddleware) 的子类，并覆盖 `response_gone_class` 和／或 `response_redirect_class` 来改变中间件使用的 [`HttpResponse`](/zh-hans/5.0/ref/request-response/#django.http.HttpResponse) 类。

#### `response_gone_class`

当在请求的路径上没有找到 [`Redirect`](#django.contrib.redirects.models.Redirect) 或有一个空的 `new_path` 值时使用的 [`HttpResponse`](/zh-hans/5.0/ref/request-response/#django.http.HttpResponse) 类。

默认为 [`HttpResponseGone`](/zh-hans/5.0/ref/request-response/#django.http.HttpResponseGone)。

#### `response_redirect_class`

处理重定向的 [`HttpResponse`](/zh-hans/5.0/ref/request-response/#django.http.HttpResponse) 类。

默认为 [`HttpResponsePermanentRedirect`](/zh-hans/5.0/ref/request-response/#django.http.HttpResponsePermanentRedirect)。
