当前位置: > Linux服务器 > nginx >

nginx url特殊字符rewrite问题

时间:2014-12-10 13:19来源:oschina.net 作者:IT
求解 :nginx遇到url中特殊字符时的问题. 

我有这样一段配置 

location ~* ^/(.*[,]+)/(.*)$ 

if ($request_uri ~ ^/(.*[,]+)/(.*)$ ){ 
set $route_information $1; 
set_unescape_uri $server_url $2; 
# echo $server_url; 
rewrite ^(.*)$ /$server_url? break; 



正则表达式是用来匹配http://hostname/ep,/originalserver/img/1k.jpg这样的url。 
$1对应上面的 ep, (有个逗号),且$1的内容是动态增长的。 $2对应上面的originalserver/img/1k.jpg. 

nginx处理正常的url上面的配置都没有问题.但是当nginx处理的url 中含有特殊的字符的时候,会对url进行解码.比如url: http://hostname/ep,/originalserver/img/good%2Ftt.jpg. 
在配置文件 rewrite 的上面输出 echo $server_url; 我输出的url特殊字符都是正常的没有变化 good%2Ftt.jpg.但是rewrite到后台(servlet request.getRequestURI,getRequestURI java官方的解释是不decode)的url 却变成了good%252Ftt.jpg 
难道rewrite也会decode url ? nginx的location 会decode url,这段正则表达式^/(.*[,]+)/(.*) 貌似也会decode url. 感觉nginx对url中特殊字符的处理不是很方便。 
不知哪位大神 有求解良药,或者指正我的错误。谢谢。


你好,我也遇到了类似的问题。我也尝试过用nginx来解决这个问题。我先说一下我的思路 

1.nginx rewrite  

2.将特殊字符的部分转移到 url 的参数中去 

3.替换不能使用的特殊字符,采用哪些可以使用的特殊字符 

4.我同事推荐给我的 escape(encodeURIComponent(text)) 

5.将get请求改为post请求 

由于我们考虑到我们现有业务的修改量,我暂时不考虑实现方式的合理性 

我采用了第3种方式,将 [ 改为 (  ,将中括号改为中文小括号。 

希望对大家有所帮助。也希望大家可以提供更合理的解决方案~

(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容