如何阻止Flask自动转义URL中的百分号编码?
区分URL中的普通短横与编码短横:获取原始请求路径
嘿,这个问题我之前处理URL编码字符区分的时候也踩过坑!你遇到的核心问题是request.full_path会自动对URL进行解码,所以%2D(短横的URL编码形式)会被转换成普通的-,导致你没法区分两者。不过别担心,有办法拿到更原始的请求路径形式。
为什么request.full_path会这样?
request.full_path返回的是已经解码后的路径加上查询参数,这是Rails(以及很多Web框架)默认的行为——它会自动把URL编码的字符转换成对应的原始字符,方便开发者直接使用,但这就丢失了原始的编码信息。
获取原始编码的请求路径
在Rails里,你可以直接访问请求环境变量里的REQUEST_URI,它会完整保留客户端发送过来的原始URL(包括所有编码字符):
# 在控制器中获取原始请求URI original_uri = request.env['REQUEST_URI'] # 对于你的请求,这个变量会返回: # /video/RIHANNA%3A-FENTY-BEAUTY-%2D-Review-%2B-First-Impressions?v=N_zDcuX1Y54
如果你只需要路径部分(不带后面的查询参数),可以简单拆分一下:
original_path = request.env['REQUEST_URI'].split('?').first # 结果就是:/video/RIHANNA%3A-FENTY-BEAUTY-%2D-Review-%2B-First-Impressions
其他框架的类似思路
如果你用的是其他Web框架,原理是一样的:找服务器提供的原始请求URI环境变量。比如:
- Sinatra中同样可以用
request.env['REQUEST_URI'] - Python Flask中可以使用
request.url(完整原始URL)或者拆分request.url来单独获取编码后的路径部分
这样你就能精准区分普通短横和经过URL编码的短横了!
内容的提问来源于stack exchange,提问作者dave
相关产品推荐
相关产品推荐

