如何在Django中将/D/<任意内容>重定向到/d/<任意内容>
Django实现/D/开头URL重定向至/d/的方案
完全可以实现,而且能精准满足你的需求——只匹配以/D/开头的路径(排除/DABC/这类),把包括URL参数在内的所有内容原封不动地重定向到小写/d/开头的对应地址。
具体实现步骤
在项目的根URL配置文件(一般是urls.py)里,按以下方式配置:
- 导入必要模块并定义重定向视图
from django.shortcuts import redirect from django.urls import re_path, path from django.conf.urls import include
- 添加重定向规则(必须放在第三方应用的URL规则之前)
def redirect_upper_d_to_lower(request, path): # 完整保留原URL的查询参数 query_params = request.META.get('QUERY_STRING', '') target_url = f'/d/{path}' if query_params: target_url += f'?{query_params}' # permanent=True 表示301永久重定向,适合长期迁移场景;临时重定向可改为False(302) return redirect(target_url, permanent=True) urlpatterns = [ # 匹配所有以/D/开头的路径,捕获后续所有内容(包括空字符串) re_path(r'^D/(?P<path>.*)$', redirect_upper_d_to_lower), # 原第三方应用的URL规则,保持不变 path('d/', include('third_party_app.urls')), # 其他项目URL规则... ]
关键细节说明
- 正则
r'^D/(?P<path>.*)$'确保只匹配路径开头是/D/的请求,不会误匹配/DABC/这类不符合要求的地址;(?P<path>.*)会捕获/D/之后的所有内容(包括空字符串,对应/D/重定向到/d/的场景)。 - 重定向视图会完整保留原URL的查询参数,比如
/D/article?id=123会被正确重定向到/d/article?id=123。 - 把重定向规则放在第三方应用的URL规则之前,是因为Django会按顺序匹配URL,确保大写路径先被捕获并重定向。
和你当前替代方案的对比
你提到的re_path(r"^[dD]/$", include(...))虽然能直接匹配大小写路径,但重定向方案的优势在于:
- 明确告知搜索引擎和客户端旧地址已迁移,对SEO更友好(尤其是301永久重定向);
- 不需要修改第三方应用的URL结构,保持原有
/d/路径的配置清晰。
内容的提问来源于stack exchange,提问作者Milano
相关产品推荐
相关产品推荐

