参考:http://blog.csdn.net/fanxiaojie119/article/details/5353186javascript
第一章:软件介绍
ISAPI_Rewrite 是一款适用于IIS的功能强大的基于正则表达式的URL处理模块。它兼容Apache的mod_rewrite的语法,从而使仅仅复制.htaccess文件就把配置从appach移植到IIS中或者从IIS移值到appach中变成可能。请参阅3.2兼容性图表这一节。
ISAPI_Rewrite最重要的功能:
? ISAPI_Rewrite提供了和Apach mod_rewrite相同的句法和行为,使仅仅拷贝.htaccess文件就完成配置移植成为功能。(要想阅读更多关于与mod_rewrite的兼容性,请参阅3.2兼容性图表这一节。)
? 正则表达式支持灵活而强大的配置。
? 极速并且容易升级的纯C++代码。
? 真正的分布式配置:实时监控服务器全局级别、虚拟主机(网站)级别、目录级别的.htaccess文件。
? 隔离性:用户级配置只影响本地用户环境,从而使ISAPI_Rewrite成为Web主机提供商的理想解决方案。
重要的应用示例:
? 搜索引擎优化。
? 一台Web服务器的代理内容通过另外一台web服务器。
? 防止内容被吸血(盗链)。
? 阻断特定主机、反向连接或者烦人的搜索机器人。
? 内容商议:向不一样的语言用户或者不一样的浏览器用户提供不一样的文件。示例
? 为群集式服务器架构模拟负载均衡。
订价资料
? 45天的试用期
? 单机版99美圆
? ISAPI_Rewrite精简版是免费的。在这里能够看到受限的细节说明。
? 大宗采购可议折扣。java
2.1系统要求
ISAPI_Rewrite能够被安装在下列操做系统中:
? Windows 2000 with IIS 5
? Windows XP with IIS 5.1
? Windows Server 2003 with IIS 6.0
? Windows Vista with IIS 7.0
? Windows Server 2008 with IIS 7.0
在安装ISAPI_Rewrite以前,操做系统中必须先安装IIS。
32位和64位的Windows版本都是支持的,可是你必须下载32位版和64位版两种不一样的安装包。Windows Installer 2.0必须运行安装程序。你能够从微软的网站上下载到最新版本的Windows Installer。
在Windows Vista和Windows Server 2008上安装ISAPI_Rewrite,还必须先安装下面两个模块(默认状况下这两个模块是不安装的)
? ISAPI过滤器
? ISAPI 扩展git
2.2安装程序
在运行安装包以前请先阅读系统要求部分。下载并安装某个版本的ISAPI_Rewrite.msi,依照安装向导的说明操做。安装过程是自动的,并有自我描述。ISAPI_Rewrite在自动安装过程当中必须重启IIS。下列服务必须被重启:IISADMIN、W3SVC。不须要手工把任何ISAPI筛选器或者扩展加入到网站或者全局列表中。它可以在安装和配置过程当中自动完成。
命令行安装
ISAPI_Rewrite也可以经过命令行进行后台安装。请使用如下命令行语法来安装:web
msiexec /i ISAPI_Rewrite3.msi /qn AcceptEULA=Yes REGISTRATIONCODE=Code REGISTRATIONNAME=Name
用命令行来后台反安装ISAPI_Rewrite请使用下面的语法:正则表达式
msiexec /x ISAPI_Rewrite3.msi /qn KEEPUSERFILES=Yes
2.3手工安装
要手工安装ISAPI_Rewrite的话,你必须下载不一样的手工安装包包含全部必须的文件。ISAPI_Rewrite精简版不支持手工安装。你能够安装所有功能或者仅仅安装它们中的一部分。
手工安装包包含下列文件:
? ISAPI_Rewrite.dll - 这是ISAPI筛选器自己。
? ISAPI_RewriteProxy.dll - 这是为代理操做的ISAPI扩展模块必不可少的。
? license.rtf - EULA的产品许可证。
? ISAPI_Rewrite.chm - .文档文件。
? httpd.conf - 全局配置文件示例。
安装ISAPI_Rewrite,首先你必须在你在IIS系统中注册ISAPI_Rewrite.dll做为ISAPI筛选器。按默认ISAPI_Rewrite.dll文件是用来做为全局ISAPI筛选器的。并且它还可以被安装到某个特定的网站里,你须要记住在同一时间段里只有一个ISAPI_Rewrite.dll实例可以加载到一个IIS工做进程里,这意味着若是你决定把ISAPI_Rewrite的ISAPI筛选器单独地安装到每一个站点里的话,你必须把这些站点切换高隔离模式,从而为这些网站产生独立的工做进程。若是你须要在每一个站点上分别安装ISAPI_Rewrite,咱们一般会建议改成在整个IIS上全局地安装它。
在Window 2000,Window XP 和Windows Server 2003中注册ISAPI 筛选器,不管是整个IIS服务器要用它仍是个别WEB网站要用它,都要用IIS 的MMC管理单元来把ISAPI_Rewrite.dll添到ISAPI筛选器列表。在Windows Vista和Windows Server 2008中首先你须要安装可选IIS组件:万维网服务、应用程序开发功能、ISAPI筛选器。
若是你须要代理服务器功能,你还须要将ISAPI_RewriteProxy.dll注册为ISAPI扩展来侍服文件扩展名“*. rwhlp”。在不一样的IIS版本中要求不一样的操做。请参阅你管理的IIS版本的文档来了解如何注册一个新的ISAPI扩展并把它映射到IIS系统的文件扩展名上。在Windows Vista和windows server 2008首先必须安装可选的IIS组件:万组网服务、应用程序开发功能、ISAPI筛选器。使用短路径名(8.3模式)做为ISAPI_RewriteProxy.dll的模块路径,若是路径里有一个空格字符,IIS载入这个模块时将失败。
把httpd.conf文件放在ISAPI_Rewrite.dll文件的同一目录下并编辑它。
把下列两行内容放到httpd.conf文件中以注册ISAPI_Rewrite 产品:算法
RegistrationName=Your registration nameRegistrationCode=REG-CODE-PROVIDED-FROM-HELICON
依照“运行ISAPI_Rewrite的权限需求”这一部分的说明来检查文件系统权限。express
2.4反安装
反安装程序会删除全部安装程序所生成的文件、从管理元库中注销筛选器,并删除全部由安装程序所添加的其它管理元库变化。若是用户决定在反安装过程当中保留用户文件的话,下列用户数据文件在反安装后会被留下来。windows
文件名 | 说明 |
Program Files/Helicon/ISAPI_Rewrite/httpd.conf | 用户规则的主配置文件 |
Program Files/Helicon/ISAPI_Rewrite/error.log | 包含错误日志的文件 |
Program Files/Helicon/ISAPI_Rewrite/rewrite.log | 包含重写日志的文件 |
.htaccess (various folders) | 用户建立的含有规则的配置文件 |
“删除用户建立的文件”的选项在将反安装过程当中提供给用户。若是启用这个选项则卸载程序也将删除位于Program Files文件夹里用户建立的文件。 .htaccess文件不会被删除。
要用命令行后台卸载ISAPI_Rewrite,请使用下面的语法:后端
msiexec /x ISAPI_Rewrite3.msi /qn KEEPUSERFILES=Yes
2.5运行ISAPI_Rewrite所需的权限
在一个干净的默认Windows系统上自动安装ISAPI_Rewrite不要求任何权限调整。可是一些其它产品好比说Plesk、IIS锁定工具的安装,等等,可能收紧服务器的安全性,并妨碍ISAPI_Rewrite的正常运行。下面是ISAPI_Rewrite的权限需求的列表单子:
在Windows 2000、Windows XP和Windows 2003的IIS5兼容模式下,筛选器运行在System账户下的inetinfo.exe进程中。那个system账户至少得被授予放置ISAPI_Rewrite安装文件的那个文件夹的“读取”和“目录浏览”的权限。咱们还建议给予system账号对这个文件夹的通常修改权。这将容许生成一些包含解析或者其它错误的文件。system账号还必须在任何包含了.htaccess文件的网站文件夹里一样被授予这些权限,不然ISAPI_Rewrite将不能加载并监视它。
请稍留意ISAPI_Rewrite安装目录上的任何一点拒绝权限设置,由于在Windows 操做系统中,拒绝权限优先于任何容许权限记录。
在Windows 2003的自然IIS模式(WPI模式)以及Windows Server 2008中,不管是筛选器仍是代理服务都运行在每一个网站相应的运行程序池的w3p.exe工做进程中,每一个应用程序池均可以使用它本身的定制来配置,这可能使权限设置成了一种复杂的工做。然而,在一个正确的IIS配置中,每一个使用中的定制必须是IIS_WPG组的一个成员。所以,IIS_WPG组能够被用来代替System账号去分配前面所写的权限需求。
在Windows Vista 中权限配置是和Windows 2003的配置差很少的,只是它没有IIW_WPG组。因此,全部的WPI账号(通常Network Service是它的唯一账号)都必须授予上述必需权限。
此外,为了让代理服务功能能工做,你必须在网站属性或者运行代理服务的web应用程序的属性中给予一个“纯脚本”的执行权限。api
2.6MSI的自定义行为自定义行为
自定义行为 | 说明 |
WiseAltStartup 自动智能启动 |
为运行在延时模式中的自定义行为保存属性的当前状态。 使用一个可执行文件(dll) 发生在:安装、反安装。 |
WiseCleanup 智能清理 |
这个行为被调用来清理上一个自定义行为所遗留下的临时文件 使用一个可执行文件(dll) 发生在:安装、反安装。 |
WiseStartup 智能启动 |
这个行为使调用一个.dll文件或者提取必要Wisescript.exe文件和.dll文件的行为能够传递参数。 使用一个可执行文件(dll) 发生在: 安装、反安装 |
WiseUpgradeCheck 智能可选择地升级 |
这个行为被调用来解决当Windows安装程序运行时不检测应用程序的早期版本的问题。 使用一个可执行文件(dll) 发生在:安装。 |
WiseUpgradeCheckEx 智能预选升级 |
添加这个行为用来解决当Windows安装程序运行时不检测应用程序的早期版本的问题。 使用一个可执行文件(dll) 发生在:安装。 |
WiseGetIISVersion 智能得到IIS版本 |
对主要的IIS版本设置属性(IISVERSION). 使用一个可执行文件(dll) 发生在:安装。 |
RegisterFilterInMetabase 在管理元库中注册筛选器 |
这个行为添加一个命名为ISAPI_Rewrite3的全局ISAPI筛选器到IIS管理元库里 IIS5, IIS6 管理元库: IIS:/LM/W3SVC/Filters/ add key ISAPI_Rewrite3 IIS:/LM/W3SVC/Filters/FilterLoadOrder append "ISAPI_Rewrite3" 使用一个可执行文件(dll) 发生在:安装。 |
RemoveFilterFromMetabase 从管理元库中删除筛选器 |
这个行为从IIS管理元库里移除了名为ISAPI_Rewrite3的全局ISAPI筛选器。 IIS5, IIS6 管理元库: IIS://localhost/W3SVC/LM/W3SVC/Filters/ delete key ISAPI_Rewrite3 IIS:/LM/W3SVC/Filters/FilterLoadOrder remove"ISAPI_Rewrite3" 使用一个可执行文件(dll) 发生在:反安装、回滚。 |
AddApplicationExtension 添加应用程序扩展 |
只用于Windows 2003机器添加ISAPI_RewriteProxy.dll到ISAPI扩展中,并使Web服务器扩展名列表中的这个ISAPI扩展名可用。 IIS6管理元库: IIS:/LM/W3SVC/ adds entry to the在管理元库属性 WebSvcExtRestrictionList中增长metabase property "ISAPI_Rewrite3 proxy"条目; 在管理元库属性 ApplicationDependencies 增长"ISAPI_Rewrite3 proxy;ISAPI_Rewrite3"条目; 使用一个可执行文件(dll) 发生在:安装。 |
RemoveApplicationExtension 删除应用程序扩展 |
只用于Windows 2003从ISAPI扩展中删除ISAPI_RewriteProxy.dll,并从web服务器扩展名列表中删除这个ISAPI扩展名。 IIS6管理元库: IIS:/LM/W3SVC/ 1.从管理元库属性 WebSvcExtRestrictionList 中删除"ISAPI_Rewrite3 proxy"条目; 2.从管理元库属性 ApplicationDependencies中删除"ISAPI_Rewrite3 proxy;ISAPI_Rewrite3"条目; 使用一个可执行文件(dll) 发生在:反安装、回滚。 |
RegisterExtensionInScriptMap 在脚本映射中注册扩展 |
在IIS管理员库中将ISAPI_RewriteProxy.dl注册为ISAPI扩展来处理*.rwhlp文件扩展名 IIS5,IIS6管理元库: IIS://LM/W3SVC/ 使用一个可执行文件(dll) 发生在:安装。 |
RemoveExtensionFromScriptMap 从脚本映射中删除扩展 |
从IIS管理元库中移除做为ISAPI扩展、用于处理*.rwhlp文件扩展名的ISAPI_Rewrite.dll的注册信息 IIS5, IIS6管理元库: IIS://LM/W3SVC/ 使用一个可执行文件(dll) 发生在:反安装、回滚。 |
GetServisesStatus 得到服务状态 |
保存IISADMIN、W2WC、NNTP、SMTP 和FTP 服务的当前状态 建立msi属性: [SERVICES_STATUS] 使用一个可执行文件(dll) 发生在: 安装、反安装。 |
StartServicesEx 按预设开启服务 |
根据状态预设来启动ISADMIN、W2WC、NNTP、 SMTP 和 FTP 服务 使用msi 属性: [SERVICES_STATUS] 使用一个可执行文件(dll) 发生在: 安装、反安装。 |
SaveProductID 保存产品ID |
若是要注册产品的话,保存REGISTRATIONNAME和REGISTRATIONCODE的属性值 使用msi 属性: [REGISTRATIONNAME] , [REGISTRATIONCODE]; 使用文件: [INSTALLDIR]\ISAPI_Rewrite3\httpd.conf 使用一个可执行文件(dll) 发生在: 安装。 |
Check32bitMode 检测32位模式 |
在64位系统中检查32位IIS兼容模式是否可用,从而安装正确的ISAPI筛选器版本。IIS6, IIS7 使用管理元库路径: IIS://LM/W3SVC/AppPools property Enable32bitAppOnWin64; 使用msi 属性:[ENABLE32BITAPPONWIN64] 检查一个32位的应用程序是否能运行在一台安装了64位版本的windows的电脑上。 使用javascript脚本 发生在: 安装。 |
CheckIISModules 检测IIS模块 |
在IIS7的机器上检查是否须要安装IsapiFilterModule和IsapiModule模块 IIS7 管理元库路径: <system.webServer> <globalModules> <add name="IsapiModule" image="%windir%\System32\inetsrv\isapi.dll" /> <add name="IsapiFilterModule" image="%windir%\System32\inetsrv\filter.dll" /> </globalModules> </system.webServer> 使用javascript脚本 发生在: 安装。 |
AddGlobalIsapiFilter 添加全局ISAPI筛选器 |
只用于IIS7的机器。这个行为会在IIS管理元库里添加一个命名为ISAPI_Rewrite3的全局ISAPI_Rewrite筛选器 IIS7的管理元库路径: <configuration> <system.webServer> <isapiFilters> <filters> <filter name="ISAPI_Rewrite3" path="C:\Program Files\Helicon\ISAPI_Rewrite3\ISAPI_Rewrite.dll" enabled="true" enableCache="false"> </filter> </filters> </isapiFilters> </system.webServer> </configuration> 使用JavaScript脚本 发生在:安装。 |
DeleteGlobalIsapiFilter 删除全局ISAPI过滤器 |
只用于IIS7的机器,这个行为会从IIS管理元库中删除名为ISAPI_Rewrite3的全局ISAPI筛选器。 IIS7的管理元库路径: <configuration> <system.webServer> <isapiFilters> <filters> <filter name="ISAPI_Rewrite3" path="C:\Program Files\Helicon\ISAPI_Rewrite3\ISAPI_Rewrite.dll" enabled="true" enableCache="false" > </filter> </filters> </isapiFilters> </system.webServer> </configuration> 使用JavaScript脚本 发生在:反安装、回滚。 |
AddIsapiCgiRestriction 添加ISAPI CGI约束 |
Only for IIS7 machines register ISAPI_RewriteProxy.dll as ISAPI extension in IIS metabase. 只用于IIS7的机器,在IIS管理元库中将ISAPI_RewriteProxy.dl为ISAPI扩展 IIS7管理元库路径: <configuration> <system.webServer> <security> <isapiCgiRestriction> <add path="C:\Program Files\Helicon\ISAPI_Rewrite3\ISAPI_RewriteProxy.dll" allowed="true" description="Helicon Proxy" /> </isapiCgiRestriction> </security> </system.webServer> </configuration> 使用JavaScript脚本 发生在:安装。 |
DeleteIsapiCgiRestriction 删除ISAPI CGI约束 |
只用于IIS7的机器,从IIS管理元库中删除用做ISAPI扩展的ISAPI_RewriteProxy.dll。 IIS7 管理元库路径: <configuration> <system.webServer> <security> <isapiCgiRestriction> <add path="C:\Program Files\Helicon\ISAPI_Rewrite3\ISAPI_RewriteProxy.dll" allowed="true" description="Helicon Proxy" /> </isapiCgiRestriction> </security> 使用JavaScript脚本 发生在:反安装、回滚。 |
AddScriptMap 添加脚本映射 |
只用于IIS7的机器,在IIS管理元库中将ISAPI_RewriteProxy.dll注册为ISAPI扩展用于处理*.rwhlp文件扩展名。 IIS7管理元库路径: <configuration> <system.webServer> <handlers> <add name="Helicon Proxy" path="*.rwhlp" verb="*" modules="IsapiModule" scriptProcessor="C:\Program Files\Helicon\ISAPI_Rewrite3\ISAPI_RewriteProxy.dll" resourceType="Unspecified"/> </handlers> </system.webServer> </configuration> 使用JavaScript脚本 发生在:安装。 |
DeleteScriptMap 删除脚本映射 |
只用于IIS7的机器,从IIS管理元库里去除用做ISAPI扩展以处理*.rwhlp文件扩展名的ISAPI_RewriteProxy.dll的注册 IIS7管理元库路径: <configuration> <system.webServer> <handlers> <add name="Helicon Proxy" path="*.rwhlp" verb="*" modules="IsapiModule" scriptProcessor="C:\Program Files\Helicon\ISAPI_Rewrite3\ISAPI_RewriteProxy.dll" resourceType="Unspecified"/> </handlers> </system.webServer> </configuration> 使用JavaScript脚本 发生在:反安装、回滚。 |
if (isset($_SERVER['HTTP_X_REWRITE_URL'])){$_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_REWRITE_URL'];}后面跟有RewriteRule(或者RewriteProxy)指令的多重RewriteCond指令只影响单个规则。若是一些条件须要被用于多个规则,必须重复写这些条件指令以应用到每条规则上。
alnum | 全部的alpha数字字母 |
alpha | 字母表字符[a-zA-Z]。其它字符也能够包含在内,这取决于本地环境 |
blank | 全部的空白字符,包含回车或者空格 |
cntrl | 全部的控制字符 |
digit | 从0到9的数字 |
graph | 全部的图画字符 |
lower | 全部的小写字母[a-z],其它的字符也能够包含在内,这取决于本地环境 |
全部的印刷字符 | |
punct | 全部的标点符号 |
space | 全部的空白占位符 |
upper | 全部的大写字母[A-Z],其它的字符也能够包含在内,这取决于本地环境 |
xdigit | 全部的16进字字符0~9,A-F |
word | 全部的词汇字符,包括字母数字外加underscore |
unicode | 全部的编码大于255的字符,这只对大范围字符特征类生效 |
这里有一些缩写法能够代替以上字符类:
? \w 代替 [:word:]
? \s 代替 [:space:]
? \d 代替 [:digit:]
? \l 代替 [:lower:]
? \u 代替 [:upper:]
单个字符转义序列
下面的转义序列是单个字符的别名:
转义序列 | 字符代码 | 含义 |
\a | 0x07 | 信号铃记号. |
\t | 0x09 | 制表符 |
\v | 0x0B | 垂直制表符 |
\e | 0x1B | ASCII转义字符 |
\0dd | 0dd | 八进制字符代码,其中dd是一个或多个八进制数字。 |
\xXX | 0xXX | 十六进制字符代码,其中XX是一个或多个八进制数字。 |
\x{XX} | 0xXX | 十六进制字符代码,其中XX是一个或更多十六进制数字,可选用Unicode字符。 |
\cZ | z-@ | ASCII转义序列control-Z,其中Z是任意一个编码大于或等于“@”的编码的ASCII字符。 |
杂项转义序列
如下提供perl的大部分兼容性,可是在\l、\L、\u和\U上有一些区别
转义序列 | 含义 |
\w | 等价于 [[:word:]]. |
\W | 等价于[^[:word:]]. |
\s | 等价于[[:space:]]。 |
\S | 等价于[^[:space:]]。 |
\d | 等价于[[:digit:]]。 |
\D | 等价于[^[:digit:]]。 |
\l | 等价于[[:lower:]]。 |
\L | 等价于[^[:lower:]]。 |
\u | 等价于[[:upper:]]。 |
\U | 等价于[^[:upper:]]。 |
\C | 任何单个字符,等价于“.” |
\X | 匹配任何Unicode组合字符序列,例如“a\x0301”(字符a和一个尖角) |
\Q | 开始引号运算符。后面跟前的全部的内容都被看成字面值,直到发现一个\E结束运算符。 |
\E | 结束引用运算符,终止一个由\Q开头的引用序列。 |
怎样获得匹配
正则表达式将匹配第一个可匹配字符串。若是从给定的起始处能够匹配到不止一个字符串,则它会匹配那个能匹配得最长的字符串。若是从同一个起始处有多个合适的匹配,并且每一个匹配的长度都同样,则将选择那个第一子表达式匹配得最长的匹配。若是有两个以上的匹配字符串它们的第一子表达式匹配得同样长,则比较第二子表达式匹配的长度,如此类推。注意:ISAPI_Rewrite使用比封演算法。只有表达式匹配了整个顺序串才能获得匹配结果。例如:
• RewriteCond URL ^/somedir/.* #将匹配任何导向somedir目录以及它的子目录的请求,与此同时,
• RewriteCond URL ^/somedir/ #只匹配somedir根目录的请求。
对“病态”正则表达式的特别提示:
ISAPI_Rewrite 使用了一个很是强大的来自Boost库的正则表达式引擎。可是它依然有一些局限性:有着一些“病态”的表达式,它可能会指数级地消耗匹配时间。这些都涉及到嵌套重复运算符,例如试图对N个连续字母a匹配表达式“(a*a)*b”,消耗的时间将与N2成正比。这些表达式经常能改为另外一种写法来避免这种问题。例如,“(a*a)*b”能够被改写成“a*b”,解析它消耗的时间与N成正比。在多数状况下,非嵌套重复表达式消耗的时间与N2成正比,可是,若是条款是相互排斥的,则它们会在线性时间里完成匹配。在“a*b”这种状况下,每一个字符将要么匹配a要么匹配b或者不匹配。相较之下,“a*a”匹配器不能告知哪一个分支被采起(第一个 a仍是第二个a)所以必须尝试两种。
Regex能够检测出这种“病态”的正则表达式并终止和它们的匹配。这将使ISAPI_Rewrite的规则失效。当一个规则失效时,ISAPI_Rewrite将给客户端发送一个"Internal Server error - Rule Failed"的状态,以表示配置错误。
4.1AccessFileName指令
说明 | 设置分布式配置文件的名称 |
语法 | AccessFileName filename [filename] ... |
默认值 | AccessFileName .htaccess |
使用环境 | server config |
指定一个ISAPI_ReWrite寻求分布式配置的文件名列表。默认文件名是.htaccess。ISAPI_ReWrite只能载入它能在这个列表中找到的第一个文件。默认状况下ISAPI_ReWrite管理者会以hidden属性标记配置文件-它将防止文件被远程用户直接访问到。
若是配置文件进行了任何修改,它将在下次请求服务器时自动加载。
4.2AllowOverride指令
说明 | 明确规定了每一个目录重写的基准URL。 |
语法 | AllowOverride All|None|directive-type [directive-type] ... |
默认值 | AllowOverride All |
使用环境 | server config, virtual host, directory |
这个指令声明了在分布式.htaccess文件里的指令是否能够覆盖父级别的httpd.conf中的指令。在ISAPI_Rewrite的使用环境中,这个指令实际上控制了特定虚拟主机或者目录的.htaccess文件的可用或者不可用。目前只支持三个值:All、None和FileInfo。
All和FileInfo使.htaccess文件以及它里面的整个ISAPI_Rewrite目录可用,None使全部的.htaccess文件以及目录不可用。这些目录具备继承性。这意味着若是你为一些目录或者虚拟主机指定AllowOverride none,.htaccess文件将对整个子目录树不可用。
4.4RewriteRule指令
说明 | 定义URL重写规则 |
语法 | RewriteRule Pattern Substitution [flags] |
使用环境 | server config, virtual host, directory, .htaccess |
这个指令定义了单个URL重写操做。它可能在一个配置文件中出现屡次,每一个实例定义一个重写URL的规则。RewriteRule指令包含URL匹配模式、替换字符串以及可选的标志设置。
Pattern(模式)是一个用来匹配当前URL的Perl兼容正则表达式。当前的URL能够是原来请求的URL或者已经由优先级高的规则替改过的URL。网址从不包含协议或者主机名,从第一个斜杠字符开始(只对httpd.conf文件适用)。并且当前网址还因不一样的应用配置级别而异。对于目录级配置(.htaccess文件),结尾的斜线和配置文件的目录名,会在匹配时被从URL中忽略掉。在建立正则表达式时,请阅读这个文档的正则表达式语法部分来获得更多的信息。
"!"字符打头的模式将否认整个表达式。否认模式不能产生子匹配,因此你不能使用$N的替代引用。
Substitution(替换)字符串指定了模式是匹配时生成URL的格式字符串。除了纯文本,它能够包括这些特殊字符。
• 对Rewrite模式的回溯引用 $N
• 对Rewrite模式的回溯引用 %N
• 服务器变量 %{VARNAME}
• 条件格式模式 ?Ntrue_string:false_string
• 分组括号“(”和“)”
替换字符串将全部的字符视为字面值,除了$'、'\'、'('、')','?',':'和'\'。为了字面化地读出特殊字符,它定义了用"\"引导的转义字符。下面的特殊字符是容许的。
$& | 输出匹配的整个表达式。 |
$` | 输出上一个的匹配结束到当前匹配的开始之间的文本(若是以前没有找到匹配串,则输出从开头到当前匹配的开始之间的文本)。 |
$' | 输出当前匹配以后跟着的全部文字。 |
$$ | 输出字面值$ |
\a | 信号铃字符 |
\f | 表单反馈字符 |
\n | 新行字符 |
\r | 回车符 |
\t | 制表符 |
\v | 垂直制表符 |
\x | 十六进制字符,好比说\x0D. |
\x{} | 一个可能的Unicode十六进制字符-例如\x{1A0} |
\cx | ASCII的转义字符x,例如\c @等价于escape-@。 |
\e | The ASCII 转义字符 |
\dd | 八进制字符常量,例如\10。 |
\l | 致使下一个字符被小写输出。 |
\u | 致使下一个字符被大写输出。 |
\L | 致使整个后继字符串被小写输出,直到遇到\E。 |
\U | 致使整个后继字符串被大写输出,直到遇到\E。 |
\E | 结束\L或者\U的后续字符串 |
\\ | 单个反斜杠字符'\' |
RewriteRule从父配置文件开始按照在配置文件中出现的次序应用。每一个规则只有在它的Pattern匹配了一个URL并且全部链接条件(RewriteCond)都匹配时才会被应用。在该URL用Substitution完成替换以后,重写过程还在继续,一直到配置文件结束或者遇到一个用了任何中止标志的规则。在Substitution中的特殊字符串"-"(短横)意味着没有替换,并且当你须要应用该规则并留下的原始的未被染指过的URL时它是颇有用的。
此外,这里有一个支持的flag(标志)列表。这些标识能够改变规则的表现。与Apache彻底兼容的标志被标记为绿色,不支持的标志被标记为绿色,只在 ISAPI_Rewrite中被支持的标识被标记成黄色。
CU (Case Upper)
把替换字符串改为大写.
CL (Case Lower)
把替换字符串改为小写.
chain|C
将当前规则与后一条规则连接起来,后一条规则只有在当前规则被匹配的状况下才能被执行。连接能够再后续连接。
cookie|CO=NAME:VAL:domain[:lifetime[:path]]
设置一个有指定字段的cookies头,并把它和当前请求的响应一块儿发送到客户端。
env|E=VAR:VAL
不支持,在UNIX环境中设置一个环境变量,在Windows系统中无心义。
forbidden|F
发送即时403 FORBIDDEN响应到客户端,中止这个请求的规则处理以及全部其余的替换处理。
gone|G
发送一个即时401Gone响应到客户端,中止这个请求的规则处理以及全部其余的替换过程。
handler|H=Content-handler
不支持,为请求明确指定了处理处理。在IIS的世界中这是能够经过重写请求的文件扩展名来实现。可是没有从Apache处理到IIS文件扩展名的直接转换方法。
last|L
中止这里的重写处理,再也不应用当前配置文件中的其它规则。在这种状况下,后代的.htaccess文件依然能被用到。
loop|LP
在一个循环中重复运行当前单个规则直到它的模式以及条件再也不被匹配了。循环次数被限定为200省得陷入无限循环。
next|N
从当前配置文件开始处重复运行重写处理。循环次数被限定为200省得陷入无限循环。
nocase|NC
这个标记使Pattern大小写不敏感。
noescape|NE
不转义输出。在ISAPI_Rewrite默认状况下,在输出中会把全部的非ANSI字符编码为十六进制数%xx。
nosubreq|NS
这个标识在ISAPI_Rewrite中与在Apache中含义不一样。精确的转换是不可能的,但这个标志可能仍然是有用的。每当配置文件处理完成以后,URL被重写了,ISAPI_Rewrite将启动这个新的URL处理过程(与Apache相同)使它能够应用到另外一个配置文件中。此标识意思是该规则只针对初始用户的请求执行,不针对已被重写过的请求执行,以防可能出现的循环。ISAPI_Rewrite限定循环重复次数为10。
nounicode|NU
若是设置了NU标记,从Unicode转换为UTF - 8将不会发生。全部Unicode字符会保持它的%xx格式不变。
O (nOrmalize)
留着用于与ISAPI_Rewrite 2.x兼容。若是使用了RewriteCompatibility2,这个指令在处理以前将URL规范化。规范化包括移除一个URL编码、错误字符,等等。同时URL的规范化将彻底移除它的查询字符串。若是RewriteCompatibility2 没有被使用,URL按照默认被规范化(就如同它在mod_rewrite中所作的),此标志的含义将反转。
proxy|P
将结果URL强制内部处理为另外一台服务器上的目标,并即时传到远程服务器上,而且,规则处理在这里中断了。远程服务器的响应将被传递回客户端。proxy须要您指定完整的URL,由协议、主机名称等开头。ISAPI_Rewrite使用ISAPI扩展来处理代理请求。你能够在代理配置章节中阅读到更多有关于此的内 容。
passthrough|PT
不支持或者始终支持。在IIS中结果始终传递到下一个处理
qsappend|QSA
追加当前查找串的数据到替换串而不是由一个替换字符串取代它。当你须要在保留原来的参数再添加更多的查询字符串参数时,可使用它。
redirect|R [=code]
强制服务器用重定向指令给客户端发送一个即时响应,提供一个新的接替位置。能够选加前缀http://thishost[:thissport]/从而把URL带到一个可用的绝对形式。若是没有给出代码,将使用一个302响应(暂时性移动)。你能够选择在3XX系列范围内指定任何代码。
skip|S=num
若是当前的规则匹配,强制rewrite引擎跳事后面num个规则。
type|T=MIME-type
强制目标文件的MIME类型转换成被设定的MIME类型。这可以被用来根据一些条件设置内容类型。
U (Unmangle log)
无损记录。记录它原来请求的网址,而不是被重写的URL。
4.5RewriteCond指令
说明 | 为如下的RewriteRule定义一个条件 |
语法 | RewriteCond TestString CondPattern |
使用环境 | server config, virtual host, directory, .htaccess |
该指令为后面的RewriteRule,RewriteHeader或RewriteProxy指令规定了一个条件。一个规则指令前能够有一个或多个条件,规则只有在全部条件获得知足的状况下才被应用。
TestString附加到纯文本能够包含下列结构。
• 用语法$N回溯引用RewriteRule模式
• 用语法%N回溯引用前面的RewriteCond模式
• 用语法${mapname:key|default}扩展RewriteMap
• 用语法%{HTTP:header}指代HTTP头值
• 用语法%{NAME_OF_VARIABLE}指代服务器变量
如下是可用的服务器变量列表:
HTTP_USER_AGENT HTTP_REFERER HTTP_COOKIE HTTP_FORWARDED HTTP_HOST HTTP_PROXY_CONNECTION HTTP_ACCEPT REMOTE_ADDR REMOTE_HOST REMOTE_PORT REMOTE_USER REMOTE_IDENT REQUEST_METHOD SCRIPT_FILENAME PATH_INFO QUERY_STRING AUTH_TYPE |
DOCUMENT_ROOT SERVER_NAME SERVER_ADDR SERVER_PORT SERVER_PROTOCOL SERVER_SOFTWARE API_VERSION THE_REQUEST REQUEST_URI REQUEST_FILENAME HTTPS |
TIME_YEAR TIME_MON TIME_DAY TIME_HOUR TIME_MIN TIME_SEC TIME_WDAY TIME 另外,全部的IIS特有的变量都是支持的。 |
CondPattern指定一个应用于TestString实例的正则表达式,如下特殊值也支持:
1.在正则表达式前头加“!”符号指明否认模式。
2.'<CondPattern'将CondPattern做为一个纯字符串按字典顺序比较,结果比较大
3.'>CondPattern'按字典顺序比较,结果比较小
4.'=CondPattern'按字典顺序比较,结果相等
5.'-d' 检测字符串是否存在目录。
6.'-f' 检测字符串是否存在文件。
7.'-s' 检测字符串是否是一个非零大小的文件。
8.'-l' (连接) 不支持的,始终为false。
9.'-x' (拥有可执行权限) 不支持的,始终为true。
10.'-F' (存在的文件,经过子请求) 不支持,和'–f'同样。
11.'-U' (存在的URL,经过子请求) 不支持的,始终为false。
下面的标记也是支持的:
'nocase|NC'
这个标记使模式大小写不敏感。
'ornext|OR'
这个标记用逻辑或而不是隐含的逻辑与结合子请求RewriteCond指令。
O
留用于ISAPI_Rewrite 2.x的兼容性。在处理前规范化字符串。规范化包括移除一个URL编码、错误字符,等等。同时URL的规范化将彻底移除它的查询字符串。
4.6RewriteBase指令
说明 | 为每一个目录的重写设置一个基准的URL |
语法 | RewriteBase URL-path |
默认值 | RewriteBase requested-directory-path |
使用环境 | directory, .htaccess |
当RewriteRule指令用于每一个目录的配置文件(.htaccess)时,它将自动从路径中剥去本地目录前缀,只对剩下的部分应用规则。RewriteBase指令容许你为这些规则精确指定一个基准。好比,哪部分要被剥离。
和Apache的mod_rewrite不一样,ISAPI_Rewrite的访问不只仅针对于物理路径,同时还针对于虚拟路径,并且能够自动地选择正确的基准。因此这个指令只是为了兼容性缘由而被保留的。
URL-path能够是相对于根的路径也能够是空,空的URL-path意味着规则的基准等同于网站的根目录。
4.7RewriteProxy指令
说明 | 代理请求到一个远程服务器 |
语法 | RewriteProxy Pattern Substitution [flags] |
使用环境 | server config, virtual host, directory, .htaccess |
使结果URL被内部处理为另外一台服务器上的目标,并即时传递到远程服务器,今后中断了规则处理。远程服务器的响应将被传递回客户端。代理要求您指定完整的URL,由协议,主机名称等开头。ISAPI_Rewrite使用ISAPI扩展来处理代理请求。你能够在配置代理的章节里阅读到更多。
语法和操做符与RewriteRule指令是相同的。可是RewroteProxy指令支持一些额外的标记。
H (preserve Host)
代理模块在链接远程服务器时将使用随着源请求一块儿发送过来的主机头,若是没有这个标志代理服务器则将用主机名和远程服务器的端口号组成主机头。
A (Add authentication headers)
容许从代理服务器将一个认证信息传递到局域网服务器上,当客户端认证和代理服务器冲突时它颇有用。服务模块将对一个请求的服务器变量
AUTH_TYPE,AUTH_USER,LOGON_USER,REMOTE_USER
追加相应的头
X-ISRW-Proxy-AUTH-TYPE,X-ISRW-Proxy-AUTH-USER,X-ISRW-Proxy-LOGON-USER,X-ISRW-Proxy-REMOTE-USER
到被代理的服务器。
CR (use Credentials)
代理模块将尝试用在URL中指定的证书身份验证登陆远程服务器,或者用基自己份验证头登陆远程服务器。用了这个标志,你能够在一个替换字符串中使用http://user:password@host.com/page语法做为一个URL。
4.8RewriteHeader指令
说明 | 重写任何请求的HTTP头 |
语法 | RewriteHeader HeaderName: Pattern Substitution [flags] |
使用环境 | server config, virtual host, directory, .htaccess |
这个RewriteHeader指令是RewriteRule指令中的一个很经常使用的变量。并且它被设计用来重写客户端的URL部分以及HTTP头的部分。技术上的RewriteRule指令,至关于RewriteHeader的URL Pattern Substitution [flag]。这个指令可用于在IIS里更多应用程序的处理以前重写、建立或者删除任何客户端请求的HTTP头。
HeaderName:指定将被重写的HTTP头的名字。
pattern、Substitution和flag与RewriteRule指令中都是相同的。
4.9RewriteMap指令
说明 | 为一个映射函数值定义一个键 |
语法 | RewriteMap MapName MapType:MapSource |
使用环境 | server config, virtual host, directory, .htaccess |
RewriteMap指令被用来定义一个键到值的查找功能。当你须要映射大量的值时,它会颇有用的,并且它的速度远远快过用规则匹配来作到它。映射功能的性能受映射文件的大小影响微乎其微。有三种类型的映射:
• txt:用一个文本文件映射
• rnd:从多个可选项中产生随机值
• int:内部函数
MapName是这个映射功能的名字,在RewriteRule命令中被用来指定这个映射。请确保每一个映射用惟一的名称定义。你可使用如下语法在RewriteRule指令的Substitution参数中调用映射功能
${ MapName : LookupKey | DefaultValue }
若是这个结构是在Substitution中出现,ISAPI_Rewrite将在映射中查找这个键,万一找到了一个,就用它的值替换这个结构。若是什么值也没有被找到,将用可选的DefaultValue。若是没有指定DefaultValue,它将用一个空串替换。
下面的标志也是支持的:
‘nocase|NC’
这个标志使该查找键大小写不敏感。
下面是一个大小写不敏感映射文件指令的示例
RewriteMap examplemap txt:C:/path/to/file/map.txt [NC]
到MapSource文件的路径,既能够是绝对地址也能够是相对地址。相对地址将被从当前配置的文件夹开始推算,换言之,就是从这个定义映射的配置文件的路径开始推算。
而后你能够在RewriteRule中以下使用这个映射:
RewriteRule ^/ex/(.*) ${examplemap:$1}
下列MapType和MapSource的组合是可用的:
txt:纯文本映射,它的source是到一个可用的文本文档的windows文件系统路径。文本文档必须是以下格式的:
#This is a commentkey1 value1 #Another commentkey2 value2keyN valueN
rnd:随机查找多个值。Source是一个文本文档的路径,文本文档必须是如下格式:
#This is a commentkey1 value1|value2|value3key2 value4|value5|value6|valueN
int: 调用内部函数。 Source必须是下列预约义的内部函数之一:
• toupper: 转换关键词为大写形式。
• tolower:转换关键词为小写形式。
• escape:把特定字符编码为十六进制。
• unescape:把十六进制值编译为特定字符。
4.10RewriteLog指令
说明 | 设置ISAPI_Rewrite日志文件的名称 |
语法 | RewriteLog file-path |
默认值 | RewriteLog installdir\rewrite.log |
使用环境 | server config |
这个指令用来设定记录ISAPI_Rewrite动做的日志文件的文件名。示例:
Rewritelog "C:\local\path\rewrite.log"
4.11RewriteLogLevel指令
说明 | 设置日志级别 |
语法 | RewriteLogLevel Level |
默认值 | RewriteLogLevel 0 |
使用环境 | server config |
这个指令设置日志的输出长度。默认值0表示不记日志,而最大的级别9则表示全部的动做都要记录。
使用使用较高的级别值可能会下降ISAPI_Rewrite的操做速度。咱们建议你当你完成规则调试以后,经过设置日志级别为零来禁用日志。
4.12RewriteOptions指令
说明 | 指定特殊选项 |
语法 | RewriteOptions Options |
使用环境 | server config, virtual host, directory, .htaccess |
这个指令能够为ISAPI_Rewrite设置特定选项。当前只有唯一一个选项可用:inherit。
inherit:强迫当前配置从父级继承全部的选项和规则。这意味着来自父级配置的全部的规则将被再次执行,除非当前环境另有相应重写规则。
4.13RewriteCompatibility2指令
说明 | 启用或禁用ISAPI_Rewrite 2.x兼容模式 |
语法 | RewriteCompatibility2 on|off |
默认值 | RewriteCompatibility2 off |
使用环境 | server config, virtual host, directory, .htaccess |
这一指令将激活与ISAPI_Rewrite 2.x版的兼容性,将一些2.X的规则正确地翻译为3.0版本的语法。这并不意味着ISAPI_Rewrite 3将开始懂得不经修改旧的语法。若是您有针对ISAPI_Rewrite 2.X的旧设计请使用ISAPI_Rewrite提供的翻译工具将这些旧规则转化为新的语法规则。
如今经过设置指令RewriteCompatibility2惟一改变的是,它将关闭网址常规前缀并删除查询字符串。 Apache的mod_rewrite将删除匹配的URL的查询字符串的这部分,相较之下ISAPI_Rewrite 2.X将匹配整个网址(包括查询字符串在内),并且[O]标记的意思将由该指令倒置。
4.14ErrorLog指令
说明 | 通常的错误文件的位置 |
语法 | ErrorLog file-path |
默认值 | ErrorLog installdir\rewrite.log |
使用环境 | server config |
这个指令设置存放ISAPI_Rewrite总体错误和消息的日志文件的名称。例如httpd.conf file load, .htaccess file load,等等
例:ErrorLog "C:local\path\error.log"
4.15LogLevel指令
说明 | 设置通常的错误的日志级别 |
语法 | LogLevel Level |
默认 | LogLevel warn |
使用环境 | server config |
这个指令设置通常日志的输出长度,跟它的重写过程无关。这里有一个level的可用值列表:emerg、alert、crit、error、warm、notice、info、debug。当前的ISAPI_Rewrite日志只记录错误信息。
设置LogLevel调试来解决配置文件中加载的问题。
4.16<VirtualHost>指令
说明 | 把应用于特定IP地或者主机的指令编组 |
语法 | <VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost> |
使用环境 | server config |
<VirtualHost> ... </VirtualHost>标签用来对应用到特定虚拟主机里的指令进行分组。
addr的可用值为:
• 特定的IP地址
• 完整的域名
• 字符'*'能够匹配任何主机或者特定服务器的任何端口号。
例如:
RewriteEngine offAllowOverride none<VirtualHost onesite.com www.onesite.com>RewriteEngine onAllowOverride all</VirtualHost>
不要忘了在每一个<VirtualHost>标签中包含RewriteEngine on指令,也不要将不能应用的规则封装进去。
4.17<Directory>指令
说明 | 将适用于特定的文件系统的目录和子目录的指令编组 |
语法 | <Directory directory-path> ... </Directory> |
使用环境 | server config, virtual host |
<Directory> ... </Directory>标签被用来对应用到特定文件系统目录以及子目录的指令进行分组。通配符?和*是可用的。正则表达式也是可用的,须要以~字符打头。
对目录路径参数必须当心:它们必须字面匹配用来访问文件的文件系统路径,用于某一特定<Directory>的指令并不适用于来自同一目录下经过不一样的路径的文件访问,例如经过不一样的符号连接。只有完整的文件路径是被容许使用的。
示例:
<Directory C:/inetpub/> AllowOverride None</Directory><Directory C:/inetpub/home/> AllowOverride FileInfo</Directory><Directory ~ "C:/inetpub/wwwroot/.*/[0-9]{3}"> # ... directives here ...</Directory>
不要忘了在每一个<Directory>标签中包含RewriteEngine on指令,也不要将不能应用的规则封装进去。
4.18<DirectoryMatch>指令
说明 | 将适用于特定的文件系统的目录和子目录的指令编组 |
语法 | <DirectoryMatch regex> ... </DirectoryMatch> |
使用环境 | server config, virtual host |
<DirectoryMatch> ... </DirectoryMatch> 被用来封装一个只适用于指定的文件系统的目录和子目录的指令组。这个指令和<Directory ~> 语法相同。
示例:
<DirectoryMatch "^/www/(.+/)?[0-9]{3}"> # ... directives here ... </DirectoryMatch>
不要忘了在每一个< DirectoryMatch>标签中包含 RewriteEngine on指令,也不要将不能应用的规则封装进去。
4.19<Files> 指令
说明 | 将应用于匹配文件名的指令包装起来 |
语法 | <Files filename> ... </Files> |
使用环境 | server config, virtual host, directory, .htaccess |
<File>指令以文件名限定了封装的指令的做用域。filename参数必须包含一个文件名,支持?和*以及以~字符打头的正则表达式。
示例:
<Files index.*> # ... directives here ... </Files><Files ~ "\.(gif|jpe?g|png)$"> # ... directives here ... </Files>
不要忘了在每一个<Files>标签中包含RewriteEngine on指令,也不要将不能应用的规则封装进去。
4.20<FilesMatch>指令
说明 | 将应用于匹配文件名的指令包装起来 |
语法 | <FilesMatch regex> ... </FilesMatch> |
使用环境 | server config, virtual host, directory, .htaccess |
<FilesMatch>指令的语法和_指令"><Files ~>语法彻底同样。
<FilesMatch "\.(gif|jpe?g|png)$">
不要忘了在每一个<FilesMatch>标签中包含RewriteEngine on指令,也不要将不能应用的规则封装进去。
4.21<Location>指令
说明 | 把被包装起来的指令集应用到匹配的URL或者虚拟路径 |
语法 | <Location URL-path|URL> ... </Location> |
使用环境 | server config, virtual host |
<Location> ... </Location>标签用来将应用到特定URL或者虚拟路径的指令分组。<Location>将运算符彻底从文件系统中分划出来,所以那些指令将不会用来控制对文件文件系统位置的访问。由于有几个不一样的URL可能映射到相同的文件系统位置。
该URL-path是一个形式为“/path/”的虚拟路径。没有协议、主机名、端口号、查询请求字符串被包含在内。URL-path能够包含通配符?和*或者以~字符打头的正则表达式。
示例:
<Location /directory> # ... rules go here</Location><Location /> # ... more rules go here</Location>
不要忘了在每一个<Location>标签中包含RewriteEngine on指令,也不要将不须要用到的规则封套进去。
4.22<LocationMatch>指令
说明 | 把被包装起来的指令集应用到正则表达式匹配的URL上 |
语法 | <LocationMatch regex> ... </LocationMatch> |
使用环境 | server config, virtual host |
这个指令的语法和指令"><Location ~>正则表达式语法彻底同样。
示例:
<LocationMatch "/(home|section)/bin"> # ... rules go here</LocationMatch>
不要忘了在每一个<LocationMatch>标签中包含RewriteEngine on指令,也不要将不能应用的规则封装进去。
RewriteEngine onRewriteRule ^(.*?\.asp)/([^/]*)/([^/]*)(/.+)? $1$4?$2=$3 [NC,LP,QSA]注意这个规则可能破坏页面与CSS文件、图片等的相对连接。至因此这样是由于在浏览器中用于推算完整资源URI的基本路径(页面的父文件夹)发生了变化。只有在您使用目录分隔符做为替代字符时才会发生这个问题。有三种可用的解决方案:
RewriteEngine onRewriteRule ^(.*?\.asp)~([^~]*)~([^~]*)(.*) $1$4?$2=$3 [NC,LP,QSA]富关键词URLs
RewriteEngine onRewriteBase /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 onRewriteBase /RewriteMap mapfile txt:mapfile.txtRewriteRule ^products/([^?/]+)\.asp /productpage.asp?productID=${mapfile:$1}
并且你必需建立包含如下内容的mapfile.txt映射文件:
one_product 1another_product 2our_super_tool 127more_products 335
这种方法的优势是:你可使用它来组合十分复杂的URL转换,可是这是一个小例子,是这个指南中的题外之话。
使用IIS做为反向代理 假设你有运行IIS的互联网服务器以及几台后台服务器或者应用程序运行在其它平台或者机器上。这些服务器不能直接在互联网上阅览,可是你必须为他人提供访问这些服务器的渠道。这里有一个演示如何简单地将某个网站的完整内容映射到另外一个运行了ISAPI_Rewrite的站点的文件夹的示例:
RewriteEngine onRewriteBase / RewriteRule mappoint(.+) http://sitedomain$1 [NC,P]
藏匿文件扩展名: 虽然不可能将一个站点的全部的文件的扩展名都藏匿起来,可是咱们可使用ISAPI_Rewrite的文件检查功能来隐藏某些已知扩展名。这里有一个藏匿网站上.asp文件扩展名的规则示例:
RewriteEngine on#Redirect extension requests to avoid duplicate contentRewriteRule ^([^?]+)\.asp$ $1 [NC,R=301,L]#Internally add extensions to requestRewriteCond %{REQUEST_FILENAME}.asp -f RewriteRule (.*) $1.asp
仿真基于主机头的虚拟网站 例如你已经注册了两个域名www.site1.com和www.site2.com。如今你可使用同一个物理站建立两个不一样的站点了。这里是一个规则示例:
RewriteEngine on#Fix missing trailing slash char on foldersRewriteRule ^([^.?]+[^.?/])$ $1/ [R,L]#Emulate site1RewriteCond %{HTTP:Host} ^(?:www\.)?site1\.com$RewriteRule (.*) /site1$1 [NC,L,NS]#Emulate site2RewriteCond %{HTTP:Host} ^(?:www\.)?site2\.com$RewriteRule (.*) /site2$1 [NC,L,NS]
如今只要把你的站点分别放到/site1和/site2目录下就能够了。注意www.site1.com和www.site2.com这两个域名必须在IIS中被映射到这个网站里,从而使ISAPI_Rewrite能拦截到请求。
或者,你可使用更多通用的规则,从而把任何请求都映射到与请求主机名同名的文件夹里。
RewriteEngine on#Fix missing trailing slash char on foldersRewriteRule ^([^.?]+[^.?/])$ $1/ [R,L]#Map requests to the foldersRewriteCond %{HTTP:Host} ^(www\.)?(.+)RewriteRule (.*) /%2$1 [NS]
网站的目录名应该是这样子的:/somesite1.com,/somesite2.info,等等。
阻断内联图像(阻止盗链) 假如你有一些页面插入了http://www.mysite.com/下的gif图片。一些其它站点将经过网页超连接插入这些图片。这会给你的网站增长不少无用的通信量,并且你但愿阻止这种作法。
虽然用ISAPI_Rewrite不能100%地保护图片不被盗链(只有专门的反盗链产品才能作到它),你至少能够在浏览器发来HTTP引用头的时候限制这种状况。下面的规则可让你只容许来自同一主机的引用页或者空地址访问到这些图片。
RewriteEngine onRewriteCond %{HTTP:Host}#%{HTTP:Referer} ^([^#]+)#(?!http://\1).+RewriteRule .*\.(?:gif|jpg|png) /block.gif [NC]
重定向非www的版本到www
若是你的网站同时能够经过两种形式的URL好比说http://helicontech.com和http://www.helicontech.com来访问到,那么最好将一种地址重定向到另外一种地址里,来避免搜索引擎对重复内容作出的处罚。下面是一个能将全部的非www地址重定向到相应的www地址上去的301重定向规则。
RewriteEngine onRewriteCond %{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 foldersRewriteRule ^([^.?]+[^.?/])$ $1/ [R,L]#Redirect non-HTTPS to HTTPSRewriteCond %{HTTP:Host} (.*)RewriteCond %{HTTPS} offRewriteCond %{REQUEST_URI} (.*)RewriteRule .? https://%1%2 [R,L]
而这个示例做用正好相反:将非SSL强制转到指定文件夹。
RewriteEngine on#Fix missing trailing slash char on foldersRewriteRule ^([^.?]+[^.?/])$ $1/ [R,L]#Redirect HTTPS to non-HTTPSRewriteCond %{HTTP:Host} (.*)RewriteCond %{HTTPS} onRewriteCond %{REQUEST_URI} (.*)RewriteRule .? http://%1%2 [R,L]
转移站点位置
当你把网站从一个域名移到另外一个域名,或者从一个文件夹移动另外一个文件夹里的时候,这是常常会遇到的问题。你但愿将一个网站的全部请求重定向到另外一个网站里,并且不丢失请求资源名以及参数。当你但愿保留现有的网页的排名和外连接的时候,它是很是有用的。这个解决方案是在旧的网站服务器上使用ISAPI_Rewrite:
RewriteEngine on#Permanent redirect to update old linksRewriteRule (.+) http://newserver.com$1 [R=301,L]
平衡负荷仿真
这个示例模拟某种DNS轮换负荷平衡技术。假设你有主站www.mysite.com和数台web服务器分别注册为www[1-9].mysite.com。若是你在主服务器上安装了ISAPI_Rewrite,你能够将初始的客户端请求重定向到几台特定服务器,从而在几台服务器之间随机摊开通信量。一旦已重定向,客户端将一直使用这一台服务器。虽然这种解决方案并不很是理想,可是它确实能分摊你的通信量并避免在维护会话状态方面发生的问题。
使用下面的规则来重定向客户端:
RewriteEngine onRewriteMap hosts rnd:hosts.txtRewriteCond %{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里使用。
RewriteLogLevel 9LogLevel debug它将建立error.log和rewrite.log两个日志文件,默认放在安装目录下。若是日志文件被建立了,它代表ISAPI_Rewrite正在运行。阅读做为结果的error.log和rewrite.log文件,将能告诉你一些问题的根源线索。
ISAPI_Rewrite 发布历史
发布 3.1.0.67
================
[筛选器功能] 加强映射文件的动态加载
[代理帮助文件错误]若是后端不设置内容长度头的话,并不会返回全部的响应。
发布 3.1.0.66
================
精简版的限制
ISAPI_Rewrite的精简版拥有相同的引擎和重写功能。可是也有下面这些限制:
? 不支持分布式.htaccess配置、目录以及网站级配置,只有一个精简版安装目录中的全局的httpd.conf配置能被载入。
? 不支持<VirtualHost>、<Directory>、<DirectoryMatch>、<Files>、<FilesMatch>、<Location> 以及<LocationMatch>这几个标签。
? 精简版中没有代理服务模块,于是全部的和代理服务功能相关的好比说RewriteProxy指令以及[P]标记都会被忽略。
? 精简版没有针对于虚拟主机环境的手工安装包
ISAPI_Rewrite精简版彻底免费,它对开发或者测试目的以及只有几个网站并且不须要分布式配置或者代理功能的小型服务器来讲是一个很好的解决方案
技术信息 ISAPI_Rewrite由四个部分组成:ISAPI筛选器、ISAPI扩展帮助、GUI管理器以及MMC嵌入式管理单元扩展。ISAPI_Rewrite筛选器和扩展都是用纯C++语言写的快速DLL模块。当安装ISAPI_Rwrite的时候, MMC嵌入式管理单元会被自动注册。ISAPI筛选器将安装在一个全局级别上,你不须要手工注册它。ISAPI扩展也会被安装并注册。
ISAPI_Rewrite管理器实用工具能够在没有安装MMC的系统中运行ISAPI_Rewrite MMC嵌入式管理单元。
Windows Vista以及Windows Server 2008系统中的ISAPI_Rewrite管理器实用工具(Helicon Manager.exe)要求管理员权限来执行,由于较小权限的用户没有权力读取IIS管理元库,而它对显示网站配置来讲是必需的。若是用受限的账号运行ISAPI_Rewrite管理器,你会获得登陆管理员账号的自动提示。
ISAPI_Rewrite筛选器已经有足够地快,所以不用担忧它的性能。除非你的服务器运行在最大负荷之下。用户在响应时间或者CPU负荷方面几乎不能发现什么区别,可是若是用了不少的规则的话,服务器最大带宽可能掉下一点来。因此请注意你用的配置决定了性能。建议每一个网站使用的规则不要超过100条。在多数状况下,能够利用RewriteMap来避免使用大量的规则。
该程序使用了Regex++ 库。
Regex++ (Version Boost 1.31)
Copyright ?1998-2004, Dr John Maddock
使用和传播许可该使用许可覆盖了全部的现有版本的ISAPI_Rewite,包括ISAPI_Rewrite、ISAPI_Rewrite彻底版、ISAPI_Rewrite精简版、ISAPI_Rewrite测试版,后面统称为ISAPI_Rewrite除非另有指明。1.全部未明确授予的权利均由Helicon Tech保留。2.全部的关于ISAPI_Rewrite的版权都由它的做者Helicon Tech独家保留。3. Helicon Tech准予无偿使用ISAPI_Rewrite精简版产品。4. Helicon Tech准予免费试用ISAPI_Rewrite产品30天,当试用期结束时,请要么购买ISAPI_Rewrite,要么删除ISAPI_Rewrite产品。5.未注册过的ISAPI_Rewrite试用版,能够在不被改动的前提下自由传播,除非有下例状况。任何我的或者公司都不用为在未得版权持有人书面许可的状况下传播ISAPI_Rewrite而付费。未经版权持有者的书面许可,未注册的试用版ISAPI_Rewrite不容许捆绑其它安装包。6. ISAPI_Rewrite必须被原样传播,不提供任何形式的保证实示或暗示。你能够在你本身的磁盘上使用ISAPI_Rewrite。做者不为由于滥用本软件致使的数据丢失、损坏,或任何其余类型的损失承担责任。7.你不得使用、复制、模仿、克隆、出租、出售、修改、反编译、反汇编以及其它任何反向工程,或者转让许可程序,或者任何许可程序的一个子集,除非本协议有提供。任何未经受权的使用将致使本许可自动终止。并可能致使刑事或民事起诉。8.本许可协议的条款是在将来版本的ISAPI_Rewrite将会有所变化。9.当你购买ISAPI_Rewrite时,将发给你“注册码”。这种“注册码”能够我的或者公司购买,并只在一台计算机上使用。若是您购买一个以上的ISAPI_Rewrite副本,发给大家的“注册码”只能在等于你购买的许可证数的计算机上使用。10.您只能使用来自Helicom Tech以及与Helicom Tech有业务合做或者技术合做的公司的注册码。11. 安装和使用ISAPI_Rewrite意味着接受这些条款及许可条件。12. 若是您不一样意本许可证的条款或违反本许可与您当地的法律规定,您必须从您的存储设备中删除ISAPI_Rewrite文件,并中止使用该产品。13.咱们坚持严格的隐私的准则,不会收集我的识别信息,除非是自愿提供的。若是您有进一步的问题或意见,请访问咱们的http://www.helicontech.com。感谢你使用ISAPI_Rewrite。Helicon Tech Corporation.