Flask route 变量规则 <path:xxx> 部署到 ngnix 后多斜杠碰到的奇怪问题

2016-05-17 20:51:05 +08:00
 MayKiller

刚接触 Flask, 在部署到 nginx 后 route 变量规则这里碰到了奇怪的问题...

from flask import Flask
app = Flask(__name__)

@app.route('/geturl/<path:url>')
def geturl(url):
    return url

if __name__=='__main__':
    app.run()

直接用 python 执行 python geturl.py 访问 http://127.0.0.1:5000/geturl/http://google.com, 返回:

http://google.com

然后用 uwsgi 部署到 nginx 后访问该地址返回:

http:/google.com

发现少了一个斜杠, 于是后面的地址用 urlencode 尝试

http://127.0.0.1:5000/geturl/http%3A%2F%2Fgoogle.com

仍然返回

http:/google.com

为什么莫名其妙的少了一个斜杠... 之后尝试, 无论多少个斜杠连在一起都只返回一个?!

如果是 nginx 的锅, 那该怎么让它支持多个连续斜杠...

4590 次点击
所在节点    Python
5 条回复
Kilerd
2016-05-17 21:14:09 +08:00
确定 是 nginx 的 锅?

试试 urldecode 先?
Zzzzzzzzz
2016-05-17 21:18:45 +08:00
nginx 里设置 merge_slashes off;
lxy
2016-05-17 21:18:51 +08:00
Try escaping "%" as "%25"
MayKiller
2016-05-17 21:25:00 +08:00
@Kilerd
直接
python geturl.py
或者
uwsgi --protocol http --socket 127.0.0.1:5000 --plugin python --module geturl --callable app
都可以正常的返回多斜杠的内容...

只不过部署到 nginx 之后... 莫名其妙的就不能多斜杠了.

> 试试 urldecode 先?
怎么试...
MayKiller
2016-05-17 21:29:25 +08:00
@Zzzzzzzzz 感谢, 果然是 nginx 的锅... 之前找半天找不到解决办法

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/279356

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX