• 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('&'));
            }
    

      

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

    作者:xuchengzone
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    NSLog的各种打印格式符 和 打印CGRect时用NSStringFromCGRect
    mac os 隐藏文件夹的小技巧
    Triangle---minimum path sum
    Partition List
    Longest Common Prefix
    Count and Say
    C++ 左值 右值
    py2exe生成.exe(python3.4 尝试)
    longest incresing sequence
    Palindrome number
  • 原文地址:https://www.cnblogs.com/xuchengzone/p/2611843.html
Copyright © 2020-2023  润新知