You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django如何通过re_path匹配含.jsp等指定串的任意URL

问题根源

原有正则匹配失效有两个核心原因:

  • 规则错误限制了.jsp后必须紧邻0或1个问号才允许匹配后续内容,完全没有覆盖扫描器常用的在.jsp后拼接URL编码特殊字符(分号、换行、其他路径片段)的绕过场景。
  • Django在执行路由匹配前,会先对请求路径做URL解码,示例路径中大量的%0A解码后是换行符,而Python正则默认模式下.通配符不匹配换行符,一旦.jsp后出现解码后的换行、回车等特殊字符,后续的.*匹配会直接中断,导致规则不生效。

另外原有规则里的\??属于冗余写法:Django路由匹配阶段天然会切割掉?及后面的查询字符串,这部分内容根本不会进入正则匹配流程。

优化方案

直接修改re_path的正则模式,通过内联正则标记开启全局匹配能力,去掉冗余的字符限制,修改后的配置如下:

from django.urls import re_path
from django.views.generic import TemplateView

re_path(
    r"(?is)^.*\.jsp.*$",
    TemplateView.as_view(template_name="404.txt", content_type="text/plain"),
),

正则参数说明

  • (?s):内联开启DOTALL模式,让.通配符可以匹配包括换行、回车在内的所有任意字符,解决URL编码特殊字符解码后阻断匹配的问题
  • (?i):内联开启忽略大小写模式,可覆盖.JSP、.Jsp等大小写变形的探测请求,不需要可以删除
  • 整体匹配逻辑:只要请求解码后的路径中包含.jsp字符串,无论该片段前后、中间夹杂什么特殊字符、路径混淆字符,都可以命中规则

可选调整

如果需要避免误匹配.jspx这类后缀,可以把正则修改为:

r"(?is)^.*\.jsp(?!x).*$"

通过负向预查排除.jsp后紧跟x的场景。

如果需要覆盖更极端的全URL编码绕过(比如.jsp本身被编码为%2E%73%70%70的场景),不建议继续堆正则复杂度,直接写一个前置中间件,在请求进入路由前拿到原始路径做字符串包含判断即可,维护成本更低。

内容的提问来源于stack exchange,提问作者xjlin0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 04:06:08