最近翻译的ISAPI_Rewrite中文手册7

来源:互联网 发布:mac如何删除office 编辑:程序博客网 时间:2024/06/02 16:25

第五章:示例

注意:这些示例中所有的规则只适用于httpd.conf文件。在ISAPI_Rewrite以及在Apachemod_rewrite中,规则的基本路径是不同的,取决于你放置.htaccess文件的目录。如果你将规则放在httpd.conf里的话,初始领头斜线必须存在,而在.htaccess文件中,到这些文件的虚拟路径会被截断。规则取决于以RewriteBase /指令引导的根路径,来允许它们在httpd.conf和目录级的.htaccess文件的任何位置上运作。

简单的搜索引擎友好的网址

下面这个例子演示了如何轻松地使用循环标记藏匿查询字符串参数。假设你有一个如下的URLhttp://www.mysite.com/foo.asp?a=A&b=B&c=C,而且你希望以这样的地址来访问它:http://www.myhost.com/foo.asp/a/A/b/B/c/C

请尝试用下面的规则来达到预期的效果:

RewriteEngine on

RewriteRule ^(.*?/.asp)/([^/]*)/([^/]*)(/.+)? $1$4?$2=$3 [NC,LP,QSA]

注意这个规则可能破坏页面与CSS文件、图片等的相对链接。至所以这样是因为在浏览器中用于推算完整资源URI的基本路径(页面的父文件夹)发生了变化。只有在您使用目录分隔符作为替代字符时才会发生这个问题。有三种可用的解决方案:

1.使用下面的规则,它不影响基本路径,因为它没有用到目录分隔符“/”

2.借助于<base href="/folder/">标签直接为页面指定正确的base路径

3.把所有的页面相对链接都变成相对于根目录的地址或者绝对地址形式。

还存在着很多种用了不同的分隔符和文件扩展名的规则。例如,使用像这样的URLhttp://www.myhost.com/foo.asp~a~A~b~B~c~C。下面的规则可以用来实现它:

RewriteEngine on

RewriteRule ^(.*?/.asp)~([^~]*)~([^~]*)(.*) $1$4?$2=$3 [NC,LP,QSA]

富关键词URLs

在上面的例子中,我们使用很一般的技术来简单地藏匿查询字符串标记。但是很多对搜索引擎优化很有用的解决方案是让您的URL关键字丰富。看看下面的网址,例如:http://www.mysite.com/productpage.asp?productID=127这是大部分网站的常见情况。但是你可以通过使用这样形式的链接来显著地提高你的网页搜索引擎抓取率:http://www.mysite.com/products/our_super_tool.aspURL中的关键词“our super tool”会被索引,并提高网页排名,但是“our_super_tool”不能直接被用来收回productid=127,这个问题存在几种解决方案。

第一个解决方案,我们建议你使用简短、只包含少数几个参数(既有关键词也有数字标识符)的URL形式,在样您的URL可能看起来如下:

http://www.mysite.com/products/our_super_tool_127.asp。实现这一重写目标只需要一个规则:

RewriteEngine on

RewriteBase /

RewriteRule ^products/[^?/]*_(/d+)/.asp /productpage.asp?productID=$1 [QSA]

另一个更复杂的解决方案是创建一对一的映射文件,并用它来映射“our_super_tool”127。该解决方案对一些有很多参数的长URL来说很有用,并允许你隐藏数字标识符。这URL看起来像是http://www.mysite.com/products/our_super_tool.asp。请注意“our_supper_tool”部分必须是产品的唯一标识,是它的标识符。下面是这种解决方案的一个示例:

RewriteEngine on

RewriteBase /

RewriteMap mapfile txt:mapfile.txt

RewriteRule ^products/([^?/]+)/.asp /productpage.asp?productID=${mapfile:$1}

而且你必需创建包含以下内容的mapfile.txt映射文件:

one_product        1

another_product  2

our_super_tool    127

more_products     335

这种方法的优点是:你可以使用它来组合十分复杂的URL转换,但是这是一个小例子,是这个指南中的题外之话。

使用IIS作为反向代理

假设你有运行IIS的互联网服务器以及几台后台服务器或者应用程序运行在其它平台或者机器上。这些服务器不能直接在互联网上阅览,但是你必须为他人提供访问这些服务器的渠道。这里有一个演示如何简单地将某个网站的完整内容映射到另一个运行了ISAPI_Rewrite的站点的文件夹的示例:

RewriteEngine on

RewriteBase /

RewriteRule mappoint(.+) http://sitedomain$1 [NC,P]

藏匿文件扩展名:

虽然不可能将一个站点的所有的文件的扩展名都藏匿起来,但是我们可以使用ISAPI_Rewrite的文件检查功能来隐藏某些已知扩展名。这里有一个藏匿网站上.asp文件扩展名的规则示例:

RewriteEngine on

#Redirect extension requests to avoid duplicate content

RewriteRule ^([^?]+)/.asp$ $1 [NC,R=301,L]

 

#Internally add extensions to request

RewriteCond %{REQUEST_FILENAME}.asp -f

RewriteRule (.*) $1.asp

仿真基于主机头的虚拟网站

例如你已经注册了两个域名www.site1.comwww.site2.com。现在你可以使用同一个物理站创建两个不同的站点了。这里是一个规则示例:

RewriteEngine on

#Fix missing trailing slash char on folders

RewriteRule ^([^.?]+[^.?/])$ $1/ [R,L]

#Emulate site1

RewriteCond %{HTTP:Host} ^(?:www/.)?site1/.com$

RewriteRule (.*) /site1$1 [NC,L,NS]

#Emulate site2

RewriteCond %{HTTP:Host} ^(?:www/.)?site2/.com$

RewriteRule (.*) /site2$1 [NC,L,NS]

现在只要把你的站点分别放到/site1/site2目录下就可以了。注意www.site1.comwww.site2.com这两个域名必须在IIS中被映射到这个网站里,从而使ISAPI_Rewrite能拦截到请求。

或者,你可以使用更多通用的规则,从而把任何请求都映射到与请求主机名同名的文件夹里。

RewriteEngine on

#Fix missing trailing slash char on folders

RewriteRule ^([^.?]+[^.?/])$ $1/ [R,L]

 

#Map requests to the folders

RewriteCond %{HTTP:Host} ^(www/.)?(.+)

RewriteRule (.*) /%2$1 [NS]

网站的目录名应该是这样子的:/somesite1.com/somesite2.info,等等。

阻断内联图像(阻止盗链)

假如你有一些页面插入了http://www.mysite.com/下的gif图片。一些其它站点将通过网页超链接插入这些图片。这会给你的网站增加很多无用的通讯量,而且你希望阻止这种做法。

虽然用ISAPI_Rewrite不能100%地保护图片不被盗链(只有专门的反盗链产品才能做到它),你至少可以在浏览器发来HTTP引用头的时候限制这种情况。下面的规则可以让你只允许来自同一主机的引用页或者空地址访问到这些图片。

RewriteEngine on

RewriteCond %{HTTP:Host}#%{HTTP:Referer} ^([^#]+)#(?!http:///1).+

RewriteRule .*/.(?:gif|jpg|png) /block.gif [NC]

重定向非www的版本到www

如果你的网站同时可以通过两种形式的URL比如说http://helicontech.comhttp://www.helicontech.com来访问到,那么最好将一种地址重定向到另一种地址里,来避免搜索引擎对重复内容做出的处罚。下面是一个能将所有的非www地址重定向到相应的www地址上去的301重定向规则。

RewriteEngine on

RewriteCond %{HTTPS} (on)?

RewriteCond %{HTTP:Host} ^(?!www/.)(.+)$ [NC]

RewriteCond %{REQUEST_URI} (.+)

RewriteRule .? http(?%1s)://www.%2%3 [R=301,L]

强制SSL或者非SSL到一个指定的位置

这里是一个演示如何将SSL强制转到指定的文件夹的示例。只要简单地把下面的规则放到该文件夹下的.htaccess文件里就可以了。

RewriteEngine on

 

#Fix missing trailing slash char on folders

RewriteRule ^([^.?]+[^.?/])$ $1/ [R,L]

 

#Redirect non-HTTPS to HTTPS

RewriteCond %{HTTP:Host} (.*)

RewriteCond %{HTTPS} off

RewriteCond %{REQUEST_URI} (.*)

RewriteRule .? https://%1%2 [R,L]

而这个示例作用正好相反:将非SSL强制转到指定文件夹。

RewriteEngine on

 

#Fix missing trailing slash char on folders

RewriteRule ^([^.?]+[^.?/])$ $1/ [R,L]

 

#Redirect HTTPS to non-HTTPS

RewriteCond %{HTTP:Host} (.*)

RewriteCond %{HTTPS} on

RewriteCond %{REQUEST_URI} (.*)

RewriteRule .? http://%1%2 [R,L]

转移站点位置

当你把网站从一个域名移到另一个域名,或者从一个文件夹移动另一个文件夹里的时候,这是经常会遇到的问题。你希望将一个网站的所有请求重定向到另一个网站里,而且不丢失请求资源名以及参数。当你希望保留现有的网页的排名和外链接的时候,它是非常有用的。这个解决方案是在旧的网站服务器上使用ISAPI_Rewrite

RewriteEngine on

#Permanent redirect to update old links

RewriteRule (.+) http://newserver.com$1 [R=301,L]

依赖于浏览器的内容

有时,至少需要在重要的顶级页面提供依赖于浏览器的内容,例如,必须为Internet Explorer提供全功能版本,为Lynx浏览器提供最小功能的版本,为其它浏览器提供一个基本功能版本。

RewriteEngine on

 

RewriteCond %{HTTP:User-Agent} MSIE

RewriteRule /foo/.htm /foo.IE.htm [L]

 

RewriteCond %{HTTP:User-Agent} (?:Lynx|Mozilla/[12])

RewriteRule /foo/.htm /foo.20.htm [L]

 

RewriteRule /foo/.htm /foo.32.htm [L]

拦截恼人的机器人

下面是一个有用的示例,演示了如何通过识别用户代理来阻止些已知的机器人和拨号器。请注意这个规则是很长的,我们把它断为多行了。为了使它正常工作,在行的头和行尾不能有任何空格。

RewriteEngine on

#Block spambots

RewriteCond %{HTTP:User-Agent} (?:Alexibot|Art-Online|asterias|BackDoorbot|Black.Hole|/BlackWidow|BlowFish|botALot|BuiltbotTough|Bullseye|BunnySlippers|Cegbfeieh|Cheesebot|/CherryPicker|ChinaClaw|CopyRightCheck|cosmos|Crescent|Custo|DISCo|DittoSpyder|DownloadsDemon|/eCatch|EirGrabber|EmailCollector|EmailSiphon|EmailWolf|EroCrawler|ExpresssWebPictures|ExtractorPro|/EyeNetIE|FlashGet|Foobot|FrontPage|GetRight|GetWeb!|Go-Ahead-Got-It|Go!Zilla|GrabNet|Grafula|/Harvest|hloader|HMView|httplib|HTTrack|humanlinks|ImagesStripper|ImagesSucker|IndysLibrary|/InfonaviRobot|InterGET|Internet/sNinja|Jennybot|JetCar|JOC/sWeb/sSpider|Kenjin.Spider|Keyword.Density|/larbin|LeechFTP|Lexibot|libWeb/clsHTTP|LinkextractorPro|LinkScan/8.1a.Unix|LinkWalker|lwp-trivial|/Mass/sDownloader|Mata.Hari|Microsoft.URL|MIDown/stool|MIIxpc|Mister.PiX|Mister/sPiX|moget|/Mozilla/3.Mozilla/2.01|Mozilla.*NEWT|Navroad|NearSite|NetAnts|NetMechanic|NetSpider|Net/sVampire|/NetZIP|NICErsPRO|NPbot|Octopus|Offline.Explorer|Offline/sExplorer|Offline/sNavigator|Openfind|/Pagerabber|Papa/sFoto|pavuk|pcBrowser|Program/sShareware/s1|ProPowerbot/2.14|ProWebWalker|ProWebWalker|/psbot/0.1|QueryN.Metasearch|ReGet|RepoMonkey|RMA|SiteSnagger|SlySearch|SmartDownload|Spankbot|spanner|/Superbot|SuperHTTP|Surfbot|suzuran|Szukacz/1.4|tAkeOut|Teleport|Teleport/sPro|Telesoft|The.Intraformant|/TheNomad|TightTwatbot|Titan|toCrawl/UrlDispatcher|toCrawl/UrlDispatcher|True_Robot|turingos|/Turnitinbot/1.5|URLy.Warning|VCI|VoidEYE|WebAuto|WebBandit|WebCopier|WebEMailExtrac.*|WebEnhancer|/WebFetch|WebGo/sIS|Web.Image.Collector|Web/sImage/sCollector|WebLeacher|WebmasterWorldForumbot|/WebReaper|WebSauger|Website/seXtractor|Website.Quester|Website/sQuester|Webster.Pro|WebStripper|/Web/sSucker|WebWhacker|WebZip|Wget|Widow|[Ww]eb[Bb]andit|WWW-Collector-E|WWWOFFLE|/Xaldon/sWebSpider|Xenu's|Zeus) [NC]

RewriteRule .? - [F]

动态生成的robots.txt

robots.txt是一个让搜索引擎用来发现必须被索引的URL和不能被索引的URL的文件。但是对拥有很多动态内容的大型站点来说,创建这个文件是一个非常复杂的任务。你有没有想过用脚本动态生成robots.txt?让我们来写这个robots.asp脚本吧:

<%@ Language=JScript EnableSessionState=False%>

<%

//The script must return plain text

Response.ContentType="text/plain";

/*

Place generation code here

*/

%>

现在使用这个单一的规则使它可用作robots.txt

RewriteEngine on

RewriteRule robots/.txt robots.asp [NC]

 平衡负荷仿真

这个示例模拟某种DNS轮换负荷平衡技术。假设你有主站www.mysite.com和数台web服务器分别注册为www[1-9].mysite.com。如果你在主服务器上安装了ISAPI_Rewrite,你可以将初始的客户端请求重定向到几台特定服务器,从而在几台服务器之间随机摊开通讯量。一旦已重定向,客户端将一直使用这一台服务器。虽然这种解决方案并不非常理想,但是它确实能分摊你的通讯量并避免在维护会话状态方面发生的问题。

使用下面的规则来重定向客户端:

RewriteEngine on

RewriteMap hosts rnd:hosts.txt

RewriteCond %{HTTP:Host} (www)/.mysite.com [NC]

RewriteRule (.*) http://${hosts:%1}.mysite.com$1 [R,L]

下面是hosts.txt文件的内容

www www1|www2|www3|www4|www5|www6|www7|www8|www9

你还可以在Apeche文档里找到很多其它有用的例子。它们多数不需要修改就可以在ISAPI_Rewrite3里使用。