orlabs / orange

OpenResty/Nginx Gateway for API Monitoring and Management.
http://orange.sumory.com
MIT License
2.31k stars 574 forks source link

URL重定向插件模板提取变量被转义 #131

Open mousycoder opened 7 years ago

mousycoder commented 7 years ago

针对Orange使用的提问, 对于简单几句话描述不清的问题, 请使用以下格式, 不符合格式或描述含糊不清的issue将不予回复。

需求或场景

URL被重定向中,参数里含有编码后的网址(http%3A%2F%2Fproxy.pay.xxx.com%2Fjmsresult.html),被重定向后,参数值不变。

使用的插件

URL重定向

具体的配置

image

期望的结果

http://proxy.xxx.com/newPayHandle?bankNo=1&bgUrl=http%3A%2F%2Fproxy.pay.xxx.com%2Fjmsresult.html&bizNo=000001098&clientIp=192.168.108.169&ext1=ext1&ext2=ext2&fgUrl=http%3A%2F%2Fproxy.pay.xxx.com%2Fjmsresult.html&orderAmt=1&orderId=201707071499408527140&orderTime=20160115165020&other1=other1&other2=other2&other3=other3&pageCharset=1&payType=W2&payerContact=boydotnet@163.com&payerName=wqxhome&peerId=0x1p23M4j56789zz&productDesc=%E6%B5%8B%E8%AF%95%E5%95%86%E5%93%81&productName=%E6%B5%8B%E8%AF%95%E5%95%86%E5%93%81&version=v1.0&xlnumId=69551120&xunleiId=xlchannel&signMsg=fd6f8b8a7edee2de343e5c4b70ed7322

错误的结果

http://proxy.xxx.com/newPayHandle?bankNo=1&bgUrl=http://proxy.pay.xxx.com/jmsresult.html&bizNo=000001098&clientIp=192.168.108.169&ext1=ext1&ext2=ext2&fgUrl=http://proxy.pay.xxx.com/jmsresult.html&orderAmt=1&orderId=201707071499408527140&orderTime=20160115165020&other1=other1&other2=other2&other3=other3&pageCharset=1&payType=W2&payerContact=boydotnet@163.com&payerName=wqxhome&peerId=0x1p23M4j56789zz&productDesc=%E6%B5%8B%E8%AF%95%E5%95%86%E5%93%81&productName=%E6%B5%8B%E8%AF%95%E5%95%86%E5%93%81&version=v1.0&xlnumId=69551120&xunleiId=xlchannel&signMsg=fd6f8b8a7edee2de343e5c4b70ed7322

noname007 commented 7 years ago

图片与描述不一致,请尽量保持一致。

noname007 commented 7 years ago

你是想说编码有问题吗?

mousycoder commented 7 years ago

已经更正了,麻烦再看下~

mousycoder commented 7 years ago

用索引式提取提取没问题,模板提取就出现这个问题

noname007 commented 7 years ago

参考下 #104

noname007 commented 7 years ago

@sumory 不算是bug吧。算是文档说明的问题吧。

sumory commented 7 years ago

我没有细看,模板式提取默认使用的lua-resty-template,所以应该给用户一个开关,让用户选择是不是开启html转义比较好? @noname007

noname007 commented 7 years ago

感觉这样做意义不太大。在这个场景里面的内容没有被浏览器当做 html 去解析的机会, 最多也就做个url编码。

建议直接使用 {* *} 替代 {{}},orange 这里做的是个中间层,建议尽量是原样传递。

sumory commented 7 years ago

@mousycoder 按照 @noname007 的建议,使用{**}可以保留原参数格式,使用{{}}则会经过html转义。测试参考示例如下:

需求

原始URL为http://localhost:8000/test_tmpl?name=abc&a_url=http://abc.com?m=123&b_url=http://opq.com,我们希望能重定向这个请求到http://test.com上,同时想正常的传递a_url,也就是说a_url参数仍能正常保留“网址”格式。

配置

在dashboard上配置如下:

image

测试

在浏览器测试,发现访问原网址时被重定向到http://test.com/?new_name=abc&new_a_url=http://abc.com?m=123&new_b_url=http://opq.com,原参数a_url按照我们的配置保留了原网址格式并成功命名为new_a_url

结论

如以上实例,使用{query.a_url}则保留了原参数格式,而使用{{query.b_url}}则会经过转义,需要使用哪一种由用户自己适当选择即可。