IIS7下使用4.0框架集成模式URLRewriter重写中文URL乱码问题

由于种种原因,最近将服务器上部署的网站修改4.0框架。但悲剧的问题出现了,发现搜索中文的时候关键词都成乱码了。

在网上查找相关资料得到几种相关解决方案如下:

  • 服务器打补丁server2008 打sp2补丁中文语言包
  • url中中文先通过Server.UrlEncode编码
  • 修改网站编码

根据以上提示进行一步一步解决 检查服务器系统已经是sp2的中文系统,网站搜索是通过js跳转的无法进行Server.UrlEncode编码,修改网站编码比较麻烦而且有可能导致其他问题,所以以上方法都行不通。

 

只能自己想办法了,自己添加一个简单测试页面 http://www.test.cn/test.aspx?kw=测试 页面输出QueryString时候发现输出的中文是正常的。再对搜索页面的地址不进行url重写的情况下访问测试,发现同样中文同样是正常的。于是初步确定是在URLRewriter中转发时候参数传递过程中出现问题。按照之前查到的使用Server.UrlEncode对参数进行编码。经过一番调试后终于是没有乱码了。

修改代码RewriterUtils.cs 的RewriteUrl方法

        internal static void RewriteUrl(HttpContext context, string sendToUrl, out string sendToUrlLessQString, out string filePath)
        {
            if (context.Request.QueryString.Count > 0)
            {
                if (sendToUrl.Contains("?"))
                {
                    sendToUrl = sendToUrl + "&" + context.Request.QueryString;
                }
                else
                {
                    sendToUrl = sendToUrl + "?" + context.Request.QueryString;
                }
            }
            string queryString = string.Empty;
            sendToUrlLessQString = sendToUrl;
            int tempIndex = sendToUrl.IndexOf('?');
            if (tempIndex != -1)
            {
                sendToUrlLessQString = sendToUrl.Substring(0, tempIndex);
                queryString = sendToUrl.Substring(tempIndex + 1);
            }
            filePath = context.Server.MapPath(sendToUrlLessQString);
            
           //iis7 获取乱码问题
            var list = queryString.Split('&');
            var newQueryStr = string.Empty;
            for (int i = 0; i < list.Length; i++)
            {
                var arr = list[i].Split('=');
                if (arr.Length > 1)
                {
                    newQueryStr = newQueryStr + arr[0] + "=" + context.Server.UrlEncode(arr[1]) + "&";
                }
                else
                {
                    newQueryStr = newQueryStr + "&";
                }
            }

            context.RewritePath(sendToUrlLessQString, string.Empty, newQueryStr.TrimEnd('&'));
        }

  

问题是解决了,不过这肯定是很笨的一种方法。先临时把问题解决,再寻找更好的办法了。希望遇到类似问题的提供意见,同时也希望遇到类似问题的人能够快速定位问题

posted @ 2012-07-27 15:07  xu.c  阅读(2495)  评论(7编辑  收藏  举报