设为首页 收藏本站
查看: 1615|回复: 0

[经验分享] asp.net URL 重写 附IIS配置+源码

[复制链接]

尚未签到

发表于 2015-8-14 11:41:50 | 显示全部楼层 |阅读模式
这里给大家ISAPI重写URL的其中一个方法。
这是以前C# + Oracle 开发B/S的时候用到的。

  相关下载
  
  还是那句。@2008 ATGO 版权所有. 保留所有权利,仅供学习使用。

ATGO_IRewrite.cpp的代码如下:
配置文件只有在运行的时候才会读取,这里提供了正则来用于不用重启IIS来重读配置文件

读取配置文件:

1 DSC0000.gif //初始化配置
  2bool ListInit()
  3 DSC0001.gif DSC0002.gif {
  4 DSC0003.gif     list<string> listRule;
  5    string strBuffer;
  6    int i = 0;
  7    int len = 0;
  8    fstream fsRead;
  9   
10    //打开文件
11    fsRead.open("C:\\ATGO_IRewrite.ini", ios::in | ios::binary);
12    fsRead.seekg(0, ios::end);
13    len = fsRead.tellg();
14    fsRead.seekg(0, ios::beg);
15    char *buf = new char[len+1];
16    buf[len] = '\0';
17    fsRead.read(buf, len);
18
19    //读取文件内容
20    for (i=0; i< len; i++)
21 DSC0004.gif DSC0005.gif     {
22        if (buf != '\n' && buf != '\r')
23        {
24            strBuffer += buf;
25 DSC0006.gif         }
26        else
27        {
28            if (!strBuffer.empty())
29            {
30                listRule.push_back(strBuffer);
31            }
32            strBuffer = "";
33        }
34    }
35
36    if (!strBuffer.empty())
37    {
38        listRule.push_back(strBuffer);
39    }
40    strBuffer = "";
41    fsRead.close();
42
43    listItem.clear();
44    cmatch match;
45
46    //如果RewriteEngine On则继续
47    if (regex_match((*listRule.begin()).c_str(), match, regexIsOn))
48    {
49        i = 0;
50
51        list<string>::iterator it = listRule.begin();
52        it ++;
53
54        //如果RewriteLogger On则启动日志功能
55        if (regex_match((*it).c_str(), match, regexIsLogger))
56        {
57            isLogger = true;
58        }
59        it ++;
60        
61        //从第三行开始读取规则
62        for (; it != listRule.end(); it++)
63        {
64            string strItem = (*it);
65
66            string strItems[3];
67            int findBlank = strItem.find_first_of(' ');
68            strItems[0] = strItem.substr(0, findBlank);
69            strItems[1] = strItem.substr(findBlank + 1, strItem.length());
70
71            findBlank = strItems[1].find_first_of(' ');
72            strItems[2] = strItems[1].substr(findBlank + 1, strItems[1].length());
73            strItems[1] = strItems[1].substr(0, findBlank);
74            
75            CItem i;
76            i.regex = strItems[1];
77            i.target = strItems[2];
78            listItem.push_back(i);
79        }
80    }
81    return 0;
82 DSC0007.gif }
83
84//释放配置
85bool ListRelease()
86{
87    listItem.clear();
88    return true;
89}   URL重写部分:


DSC0008.gif DSC0009.gif 代码

1DWORD CATGO_IRewriteFilter::OnPreprocHeaders(CHttpFilterContext* pCtxt,
  2    PHTTP_FILTER_PREPROC_HEADERS pHeaderInfo)
  3{
  4    // TODO: React to this notification accordingly and
  5    // return the appropriate status code
  6
  7    //获取hostname
  8    char server_name[2048];
  9    DWORD buffSize_server_name = sizeof(server_name);
10    BOOL bHeader_server_name = pCtxt->GetServerVariable("SERVER_NAME", server_name, &buffSize_server_name);
11
12    //获取url
13    char buffer[2048];
14    DWORD buffSize = sizeof(buffer);
15    BOOL bHeader = pHeaderInfo->GetHeader(pCtxt->m_pFC, "url",
16        buffer, &buffSize);
17
18    cmatch match;
19    fstream fs;
20
21    //特别码
22    if (boost::regex_match(buffer, match, regexAtgo))
23    {
24        for (int i=1; i<match.size(); i++)
25        {
26            string strMatch = match;
27
28            if (strMatch == "Release")
29            {
30                ListRelease();
31                if (isLogger)
32                {
33                    fs.open("C:\\Log\\ATGO_IRewrite_Error.log", ios::in | ios::app | ios::binary | ios::out | ios::ate);   
34                    string error = "错误代码1004-1!请与kx.ATGO@hotmail.com联系!";
35                    fs.write(error.c_str(), error.length());
36                    fs.write("\r\n", ::strlen("\r\n"));
37                    fs.close();
38                }
39            }
40            else if (strMatch == "Init")
41            {
42                ListInit();
43
44                if (isLogger)
45                {
46                    fs.open("C:\\Log\\ATGO_IRewrite_Error.log", ios::in | ios::app | ios::binary | ios::out | ios::ate);   
47                    string error = "错误代码1004-2!请与kx.ATGO@hotmail.com联系!";
48                    fs.write(error.c_str(), error.length());
49                    fs.write("\r\n", ::strlen("\r\n"));
50                    fs.close();
51                }
52            }
53            else if (strMatch == "Cmd")
54            {
55                ;
56            }
57            if (isLogger)
58            {
59                fs.open("C:\\Log\\ATGO_IRewrite_Error.log", ios::in | ios::app | ios::binary | ios::out | ios::ate);   
60                string error = "警告代码1004-3!" + strMatch + "请与kx.ATGO@hotmail.com联系!";
61                fs.write(error.c_str(), error.length());
62                fs.write("\r\n", ::strlen("\r\n"));
63                fs.close();
64            }
65        }
66    }
67
68
69    if (listItem.size() > 0)
70    {
71        string str = "";
72
73        string allUrl = "http://";
74        allUrl = allUrl + server_name;
75        allUrl = allUrl + buffer;
76        
77        if (isLogger)
78        {
79            fs.open("C:\\Log\\ATGO_IRewrite_log.log", ios::in | ios::app | ios::binary | ios::out | ios::ate);
80            str = "原始进来的URL:" + allUrl;
81            fs.write(str.c_str(), str.length());
82            fs.write("\r\n", ::strlen("\r\n"));
83            fs.close();
84        }
85
86        //从配置文件中的配置,找相关匹配
87        for (list<CItem>::iterator it = listItem.begin(); it != listItem.end(); it++)
88        {
89            CItem ci = (*it);
90            boost::regex regex(ci.regex, boost::regex::icase);
91
92            if (boost::regex_match(allUrl, match, regex))
93            {
94                string temp = ci.target;
95                for (int i=1; i<match.size(); i++)
96                {
97                    char buffer[128];
98                    ::sprintf(buffer, "$%d", i);
99                    string str = buffer;
100                    int index = temp.find(str, 0);
101                    if (index != -1)
102                    {
103                        temp = temp.replace(index, str.length(), match);
104                    }
105                }
106                allUrl = temp;
107                if (isLogger)
108                {
109                    fs.open("C:\\Log\\ATGO_IRewrite_log.log", ios::in | ios::app | ios::binary | ios::out | ios::ate);
110                    str = "按正则生成URL为:" + allUrl;
111                    fs.write(str.c_str(), str.length());
112                    fs.write("\r\n", ::strlen("\r\n"));
113                    fs.close();
114                }
115                break;
116            }
117        }
118        
119        if (allUrl != "")
120        {
121            int itemp = 0;
122            itemp =allUrl.find_first_of("//");
123
124            if (itemp > 0)
125            {
126                allUrl = allUrl.substr(itemp + 2, allUrl.length());
127               
128                itemp = allUrl.find_first_of("/");
129                allUrl = allUrl.substr(itemp, allUrl.length());
130            }
131            if (isLogger)
132            {
133                fs.open("C:\\Log\\ATGO_IRewrite_log.log", ios::in | ios::app | ios::binary | ios::out | ios::ate);
134                str = "重定向URL为" + allUrl;
135                fs.write(str.c_str(), str.length());
136                fs.write("\r\n", ::strlen("\r\n"));
137                fs.write("\r\n", ::strlen("\r\n"));
138                fs.close();
139            }
140
141            pHeaderInfo->SetHeader(pCtxt->m_pFC, "url", (char *)allUrl.c_str());
142        }
143    }
144   
145    return SF_STATUS_REQ_NEXT_NOTIFICATION;
146}  

  配置文件说明:
RewriteEngine on
RewriteLogger on
RewriteRule .*/(.*)\.atgo /$1.htm
第一行是开启URL重写
第二行是开启日志
第三行是对URL进行正则匹配,Pattern为.*/(.*)\.atgo,如果匹配成功,则转换成/$1.htm
其中$1是前面正则中()的值。

安装说明:
1.把ATGO_IRewrite.ini放到C盘根目录下;
2.把ATGO_IRewrite.dll添加到IIS的ISAPI里;
DSC00010.jpg

注:如果是NTFS格式的要设置一下配置文件的权限
DSC00011.jpg

3.重启IIS服务。
效果图:
DSC00012.jpg

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-98916-1-1.html 上篇帖子: IIS管理器配置与优化 下篇帖子: 为Silverlight应用程序配置IIS
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表