这是以前C# + Oracle 开发B/S的时候用到的。
还是那句。@2008 ATGO 版权所有. 保留所有权利,仅供学习使用。
ATGO_IRewrite.cpp的代码如下:
配置文件只有在运行的时候才会读取,这里提供了正则来用于不用重启IIS来重读配置文件
读取配置文件:
1
//
初始化配置
2
bool
ListInit()
3
{
4
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
{
22
if (buf[i] != '\n' && buf[i] != '\r')
23
{
24
strBuffer += buf[i];
25
}
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
}
83
84
//
释放配置
85
bool
ListRelease()
86
{
87
listItem.clear();
88
return true;
89
}

2

3


4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21


22

23


24

25

26

27


28

29


30

31

32

33

34

35

36

37


38

39

40

41

42

43

44

45

46

47

48


49

50

51

52

53

54

55

56


57

58

59

60

61

62

63


64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86


87

88

89

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 }
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 }
配置文件说明:
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里;

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

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