这里给大家ISAPI重写URL的其中一个方法。
这是以前C# + Oracle 开发B/S的时候用到的。

相关下载

 

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

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

读取配置文件:
 1asp.net URL 重写 附IIS配置+源码//初始化配置
 2asp.net URL 重写 附IIS配置+源码bool ListInit()
 3}

URL重写部分:

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[i];
 
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[i]);
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}

相关文章: