ISAPI_Rewrite示例
Examples
Emulating host-header-based virtual sites on a single site
For example you have registered two domains www.site1.com and www.site2.com. Now you can create two different sites using single physical site. Add the following rules to your httpd.ini file:
[ISAPI_Rewrite] #Fix missing slash char on folders RewriteCond Host: (.*) RewriteRule ([^.?]+[^.?/]) http\://$1$2/ [I,R] #Emulate site1 RewriteCond Host: (?:www\.)?site1\.com RewriteRule (.*) /site1$1 [I,L] #Emulate site2 RewriteCond Host: (?:www\.)?site2\.com RewriteRule (.*) /site2$1 [I,L] |
Now just place your sites in /site1 and /site2 directories.
Or you can use more generic rules:
[ISAPI_Rewrite] #Fix missing slash char on folders RewriteCond Host: (.*) RewriteRule ([^.?]+[^.?/]) http\://$1$2/ [I,R] RewriteCond Host: (www\.)?(.+) RewriteRule (.*) /$2$3 |
The directory names for sites should be like /somesite1.com, /somesite2.info, etc.
Using different namespaces on development and live servers
Suppose you are developing rules for a website that will be deployed to a /livesite/ folder on a live server. However, on a development machine you need to store files in the /develop/ folder. In this case you could use UriMatchPrefix and UriFormatPrefix directives to minimize a number of changes those will be needed for a namespace change:
[ISAPI_Rewrite] #specify namespaces with UriMatchPrefix and UriFormatPrefix UriMatchPrefix /develop UriFormatPrefix /develop #rules are going here #really we are checking for /develop/sampleN.htm and formatting to /develop/sampleN.asp RewriteRule /sample1.htm /sample1.asp [I,L] RewriteRule /sample2.htm /sample2.asp [I,L] RewriteRule /sample3.htm /sample3.asp [I,L] #reset namespaces to default UriMatchPrefix UriFormatPrefix |
The only things you will need to change before a deployment to a live server are values of UriMatchPrefix and UriFormatPrefix.
Using loops (Next flag) to convert request parameters
Suppose you wish to access physical URLs like http://www.myhost.com/foo.asp?a=A&b=B&c=C using requests like http://www.myhost.com/foo.asp/a/A/b/B/c/C and the number of parameters may vary from one request to another.
There exist at least two possible solutions. You could simply add a separate rule for each possible number of parameters or you could use a technique demonstrated by the following example.
[ISAPI_Rewrite] RewriteRule (.*?\.asp)(\?[^/]*)?/([^/]*)/([^/]*)(.*) $1(?2$2&:\?)$3=$4$5 [NS,I] |
This rule will extract one parameter from request URL, append it to the end of the request string and restart rules processing from the beginning. So it will loop until all parameters will be moved to the right place (or until the RepeatLimit will be exceeded).
There also exist many variations of this rule with different separator characters. For example, to use URLs like http://www.myhost.com/foo.asp~a~A~b~B~c~C the following rule could be implemented:
[ISAPI_Rewrite] RewriteRule (.*?\.asp)(\?[^~]*)?~([^~]*)~([^~]*)(.*) $1(?2$2&:\?)$3=$4$5 [NS,I] |
Running servers behind IIS
Assume we have internet server running IIS and several corporate servers running other platform. These servers are not directly accessible from the internet but only from our corporate network. Here is a simple example how to map another server into the IIS site’s namespace using proxy flag:
[ISAPI_Rewrite] RewriteProxy /mappoint(.+) http\://sitedomain$1 [I,U] |
Moving sites from UNIX to IIS
This rules can help change the URL from /~username to /username and /file.html to /file.htm. It can be useful if you just moved your site from UNIX to IIS and keep getting hits to the old pages from search engines and other external pages.
[ISAPI_Rewrite] #redirecting to update old links RewriteRule (.*)\.html $1.htm RewriteRule /~(.*) http\://myserver/$1 [R] |
Moving site location
Many webmasters asked for a solution to the following problem: They want to redirect all requests to one web server to another web server. Such problems usually arise when you need to establish a newer web server which will replace the old one over time. The solution is to use ISAPI_Rewrite on the old web server:
[ISAPI_Rewrite] #redirecting to update old links RewriteRule (.+) http\://newwebserver$1 [R] |
Browser-dependent content
It is sometimes necessary to provide browser-dependent content at least for important top-level pages, i.e. one has to provide a full-featured version for the Internet Explorer, a minimum-featured version for the Lynx browsers and an average-featured version for all others.
We have to act on the HTTP header "User-Agent". The sample code does the following: If the HTTP header "User-Agent" contains "MSIE", the target foo.htm is rewritten to foo.IE.htm. If the browser is "Lynx" or "Mozilla" of version 1 or 2 the URL becomes foo.20.htm. Other browsers receive page foo.32.html. All this is done by the following ruleset:
[ISAPI_Rewrite] RewriteCond User-Agent: .*MSIE.* RewriteRule /foo\.htm /foo.IE.htm [L] RewriteCond User-Agent: (?:Lynx|Mozilla/[12]).* RewriteRule /foo\.htm /foo.20.htm [L] RewriteRule /foo\.htm /foo.32.htm [L] |
Dynamically generated robots.txt
robots.txt is a file that search engines use to discover URLs that should or should not be indexed. But creation of this file for large sites with lot of dynamic content is a very complex task. Have you ever dreamed about dynamically generated robots.txt? Let's write robots.asp script:
<%@ Language=JScript EnableSessionState=False%> <% //The script must return plain text Response.ContentType="text/plain"; /* Place generation code here */ %> |
Now make it robots.txt using single rule:
[ISAPI_Rewrite] RewriteRule /robots\.txt /robots.asp |
Making search engines to index dynamic pages
Content of the site stored in XML files. There is /XMLProcess.asp file that processes XML files on server and returns HTML to end user. URLs to the documents have a form of:
http://www.mysite.com/XMLProcess.asp?xml=/somdir/somedoc.xml
But many popular search engines will not index such documents because URLs contain question mark (document is dynamically generated). ISAPI_Rewrite can competely eliminate this problem.
[ISAPI_Rewrite] RewriteRule /doc(.*)\.htm /XMLProcess.asp\?xml=$1.xml |
Now to access documents use URL like http://www.mysite.com/doc/somedir/somedoc.htm. Search engines will never know that physically there is no somedoc.htm file and content is dynamically generated.
Negative expressions (NOT)
Sometimes you need to apply rule when some pattern not matches. In this case you may use so called Forward Lookahead Asserts in regular expressions.
For example you need to move all users not using Internet Explorer to the other location:
[ISAPI_Rewrite] # Redirect all non Internet Explorer users # to another location RewriteCond User-Agent: (?!.*MSIE).* RewriteRule (.*) /nonie$1 |
Dynamic authentication
For example we have some members area on the site and we need password-protect files in this area but we don't like to use built-in server security. In this case it is possible to create ASP script (call it proxy.asp) that will proxy all requests to the members area and check for required permissions. Here is a simple template for this page where you can put your own authorization code:
<%@ Language=JScript EnableSessionState=False%>
<%
function Authorize()
{
//Check if the user is authorized to view a resource here
//Return true if user has a required permission, otherwise return false
return true;
}
if(!Authorize())
{
//Redirect to the login page
Response.Redirect("http://mysite.com/LoginPage.asp?ref="+Request.QueryString.Item);
Response.End()
}
var WinHttpReq = new ActiveXObject("WinHttp.WinHttpRequest.5");
WinHttpReq.Open(Request.ServerVariables("REQUEST_METHOD").Item, Request.QueryString.Item, true);
var headers=String(Request.ServerVariables("ALL_RAW")).split("\n");
for(i=0; i<headers.length && headers[i]; i++)
{
header = headers[i].match(/([\w-\.]+):\s*([ \S]*)/);
if(header)
WinHttpReq.SetRequestHeader(header[1],header[2]);
}
if(lngCount = Request.TotalBytes)
{
var data=Request.BinaryRead(lngCount);
WinHttpReq.Send(data);
} else {
WinHttpReq.Send();
}
if(!WinHttpReq.WaitForResponse(15))
{
WinHttpReq.Abort();
Response.Status="408 Request Timeout";
} else {
Response.Status = "" + WinHttpReq.Status + " " + WinHttpReq.StatusText;
headers=String(WinHttpReq.GetAllResponseHeaders()).split("\n");
for(i=0; i<headers.length && headers[i]; i++)
{
header = headers[i].match(/([\w-\.]+):\s*([ \S]*)/);
if(header)
Response.AddHeader(header[1],header[2]);
}
Response.Write(WinHttpReq.ResponseText);
}
%>
|
Now we need to configure ISAPI_Rewrite to proxy requests through this page:
[ISAPI_Rewrite] # Proxy all requests through proxy.asp RewriteRule /members(.+) /proxy.asp\?http\://mysite.com/members$1 |
Blocking inline-images (stop hot linking)
Assume we have some pages with inlined GIF graphics under http://www.mysite.com/. These graphics are nice, so others directly incorporate them via hyperlinks to their pages. We don't like this practice because it adds useless traffic to our server.
While we cannot 100% protect the images from inclusion, we can at least restrict the cases where the browser sends a HTTP Referer header.
[ISAPI_Rewrite] RewriteCond Host: (.+) |
Regular Expressions Testing Tool
RXTest utility could be used to simulate rule execution. The following examples demonstrate its usage.
-
A simple rule:
RewriteRule (.+) http\://newwebserver$1 [I,R]
Regular expression textbox will correspond to the pattern part of the rule. Here it will be:
(.+)
Format string textbox will correspond to the format part of the rule. In this case it will be:
http\://newwebserver$1
Ignore case checkbox will correspond to the I flag of the rule. So, it shall be checked.
Something like /test could be taken as the Test string. Then you will get http://newwebserver/test as the Format Result. -
A rule with a condition:
RewriteCond Host: (?!www\.)(.+) RewriteRule (.+) http\://www.$1$2 [I,RP]
To combine two regular expressions into a single one some separator character that will not occur in a real URI could be used. For example, it could be !. Then Regular expression will be:
(?!www\.)(.+)!(.+)
Format string textbox will be:
http\://www.$1$2
Ignore case checkbox will be checked.
If www.host.com!/anything will be taken as the Test string result will be Not matched. But host.com!/anything will produce http://www.host.com/anything. -
A rule with iterations:
RewriteRule (.*?\.asp)(\?[^/]*)?/([^/]*)/([^/]*)(.*) $1(?2$2&:\?)$3=$4$5 [NS,I]
Such rule (having N or NS flag) could not be simulated in the Regular Expressions Test Tool as a whole. However it could be simulated step by step. Initially rule could be splitted into a pattern and format as in the previous samples. Then on the first step some test string could be provided that will result in some format result. This format result should be taken as a test string on the second step, etc.
- Use the rule given below. It does not affect base path.
- Directly specify correct base path for a page with the help of <base href="/folder/page.asp"> tag.
- Change all page-relative links to either root-relative or absolute form.
From:http://aspasp.ezhu.cn/17130/post/14983/
版权声明:
作者:Kiyo
链接:https://www.wkiyo.cn/html/2008-01/i447.html
来源:Kiyo's space
文章版权归作者所有,未经允许请勿转载。

共有 0 条评论