zoukankan      html  css  js  c++  java
  • 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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    WEB常见漏洞合集
    SQL注入个人理解及思路(包括payload和绕过的一些方式)
    渗透测试流程
    kali 中文乱码解决方法
    python编写的banner获取代码的两种方式
    python编写banner获取的常用模块
    Python安全基础编写
    oracle数据库(四)
    oracle数据库(三)
    oracle数据库(二)
  • 原文地址:https://www.cnblogs.com/xuchengzone/p/2611843.html
Copyright © 2011-2022 走看看