如何在Django中使用正则表达式将/mobile/后缀任意路径的URL重定向至/mobile
解决Django中/mobile/后续任意路径重定向至/mobile/的问题
这个问题我之前也碰到过,核心就是你的正则表达式匹配范围太严格,没覆盖到那些带后续路径的请求~
问题原因
你原来的URL规则:
url(r'^mobile/$', views.mobile, name='mobile')
这里的$表示字符串结束,所以只有完全匹配/mobile/(或者Django自动处理的/mobile,取决于APPEND_SLASH设置)的请求才会命中这个规则。而像/mobile/hello/world/xxx这类路径,在mobile/之后还有额外内容,自然匹配不到,也就不会触发重定向。
解决方案
你需要添加一个额外的URL规则,用来捕获所有以/mobile/开头、后面带有任意内容的路径,然后统一重定向到正确的/mobile/页面。具体步骤如下:
- 首先保留你原来的URL规则,它负责处理正常的
/mobile/请求; - 导入Django的
RedirectView(如果还没导入的话); - 添加新的重定向规则,注意必须放在原来的规则之后,避免覆盖正常请求:
from django.views.generic.base import RedirectView urlpatterns = [ # 原来的正常匹配规则 url(r'^mobile/$', views.mobile, name='mobile'), # 捕获所有/mobile/后续的任意路径,重定向到mobile命名URL url(r'^mobile/.+$', RedirectView.as_view(pattern_name='mobile', permanent=True)), ]
参数说明
pattern_name='mobile':指定要重定向到的命名URL(就是你原来规则里的name='mobile'),这样不用硬写URL路径,更灵活;permanent=True:设置为永久重定向(HTTP 301),如果需要临时重定向(HTTP 302),可以改成permanent=False,根据你的业务需求选择。
这样设置后,不管用户输入/mobile/后面跟着什么内容,都会自动跳转到/mobile/页面啦~
内容的提问来源于stack exchange,提问作者Angela Rubchinksy
相关产品推荐
相关产品推荐

