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

Django生产环境URL正则匹配异常:多斜杠被忽略如何解决

问题分析与解决思路

核心原因是Python Anywhere使用的Apache服务器默认会把URL里的连续斜杠(比如//)合并成单个斜杠,所以Django接收到的请求路径已经是处理后的版本,自然匹配不上你原本针对多斜杠写的正则规则。

解决方法

1. 调整服务器配置,禁止合并连续斜杠

在Python Anywhere的Web管理界面中找到「Apache & WSGI Settings」,在「Extra configuration directives」区域添加以下配置:

AllowEncodedSlashes NoDecode
RewriteEngine On
RewriteRule ^(.*)$ $1 [NE]

配置生效后,Apache会保留原始URL里的连续斜杠,不再自动合并,Django就能收到包含//的完整请求路径,你的原始正则规则就能正常匹配。

2. 通过Django中间件修复请求路径

如果无法修改服务器配置,可以自定义中间件,从请求元数据中获取原始未修改的URL,替换Django使用的请求路径:

# 在你的app目录下创建middleware.py文件
from django.utils.deprecation import MiddlewareMixin

class PreserveSlashesMiddleware(MiddlewareMixin):
    def process_request(self, request):
        raw_uri = request.META.get('REQUEST_URI', '')
        # 剥离URL中的参数部分,只保留路径
        path = raw_uri.split('?')[0]
        # 替换request的path_info为原始路径
        request.path_info = path

然后在项目settings.py的MIDDLEWARE列表中添加这个中间件(放在靠前位置,比如最顶部):

MIDDLEWARE = [
    'your_app_name.middleware.PreserveSlashesMiddleware',
    # 其他中间件...
]

这样Django处理URL时会使用原始的多斜杠路径,你的原始正则规则就能正常匹配。

为什么修改正则会导致功能异常

你修改后的正则把/?插入到payment_id可选分组之后,打乱了原本的匹配逻辑:当URL出现//时,正则会把第一个斜杠匹配为payment_id分组的可选前缀,第二个斜杠被当成is_email_sent分组的前缀,最终导致两个参数的取值错误,引发功能异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 02:47:32