just do it

ISAPI_Rewrite 应用详解

ISAPI_Rewrite语法规则

ISAPI_Rewrite 规则对大小写敏感,但可以忽略大小写了。
I (ignore case)不管大小写强行指定字符匹配。
例:RewriteRule /code/project/([0-9,a-z]*).html /soft.jsp\?softpy=$1 [I]

其他的参数一览
I (ignore case) 
不管大小写强行指定字符匹配,这个FLAG影响RewriteRule指令和相应的RewriteCond 指令。

F (Forbidden) 
对客户端做反应,停止REWRITING进程并且发送403错误,注意在这种情况下FORMATSTRING 是无用的并可以设置为任何非空字符串。

L (last rule) 
不应用任何重写规则在此停止重写进程,使用这个FLAG以阻止当前被重写的URI被后面的规则再次重写。

N (Next iteration) 
强制REWRITINGENGINE调整规则目标并且从头重启规则检查(所有修改将保存),重启次数由RepeatLimit指定的值限制,如果这个数值超过N FLAG将被忽略。

NS (Next iteration of the same rule) 
以N标记工作不从相同的规则重启规则规则进程(例如强制重复规则应用),通过RepeatLimit指令指定一个反复实行某一规则的最大数目。

P (force proxy) 
强制目的URI在内部强制为代理需求并且立即通过ISAPI扩展应付代理需求,必须确认代理字符串是一个有效的URI包括协议 主机等等否则代理将返回错误。

R (explicit redirect)
强制服务器对客户端发出重定向指示即时应答,提供目的URI的新地址,重定向规则经常是最后规则。

RP (permanent redirect) 
几乎和[R]标记相同但是发布301HTTP状态而不是302HTTP状态代码。

U (Unmangle Log) 
当URI是源需求而不是重写需求时记载URI。

O (nOrmalize) 
在实行之前标准化字符串。标准化包括URL-ENCODING,不合法的字符的再移动等,这个标记对于URLS和URLS-ENDODED头是有用的。

CL (Case Lower)
小写。

CU (Case Upper)
大写。

RewriteHeader directive 
Syntax: RewriteHeader HeaderName Pattern FormatString [Flags]
这个指令是RewriteRule的更概括化变种,它不仅重写URL的客户端需求部分,而且重写HTTP头,这个指令不仅用于重写。生成,删除任何HTTP头,甚至改变客户端请求的方法。

HeaderName 
指定将被重写的客户头,可取的值与 RewriteCond 指令中TestVerb参数相同。

Pattern 
限定规则表达式以匹配Request-URI。

FormatString
限定将生成新的URI的FormatString 。
[Flags] 
是一个下列FLAGS的命令分隔列表。

I (ignore case)
不管大小写强行指定字符匹配,这个FLAG影响RewriteRule指令和相应的RewriteCond 指令。
F (Forbidden)
对客户端做反应,停止REWRITING进程并且发送403错误,注意在这种情况下FORMATSTRING 是无用的并可以设置为任何非空字符串。

L (last rule) 
不应用任何重写规则在此停止重写进程,使用这个FLAG以阻止当前被重写的URI被后面的规则再次重写。

N (Next iteration) 
强制REWRITINGENGINE调整规则目标并且从头重启规则检查(所有修改将保存),重启次数由RepeatLimit指定的值限制,如果这个数值超过N FLAG将被忽略。

NS (Next iteration of the same rule)
以N标记工作不从相同的规则重启规则规则进程(例如强制重复规则应用),通过RepeatLimit指令指定一个反复实行某一规则的最大数目。

R (explicit redirect) 
强制服务器对客户端发出重定向指示即时应答,提供目的URI的新地址,重定向规则经常是最后规则。

RP (permanent redirect) 
几乎和[R]标记相同但是发布301HTTP状态而不是302HTTP状态代码。

U (Unmangle Log) 
当URI是源需求而不是重写需求时记载URI。

O (nOrmalize) 
在实行之前标准化字符串。标准化包括URL-ENCODING,不合法的字符的再移动等,这个标记对于URLS和URLS-ENDODED头是有用的。

CL (Case Lower)
小写。
CU (Case Upper) 
大写。

因为需要用到二级域名,三级域名提供给会员的,用的正则是别人写好的如下:
=================================
[ISAPI_Rewrite]
RepeatLimit 1
# Defend your computer from some worm attacks
RewriteRule .*(?:global.asa|default\.ida|root\.exe|\.\.).* . [F,I,O]

# 排除当前虚拟主机需要正常访问的域名(web.eboat.cn www.eboat.cn)
# RewriteCond Host: (?:web|www)\.eboat\.cn
# 多数情况下是一个,即当前提供二级域名服务的系统(如建站系统)
RewriteCond Host: web\.eboat\.cn
RewriteRule (.*) $1 [L]

# 解决不规范目录(末尾无/)的问题
# 但前提是目录名不含‘.’而文件名必须包含,否则无法区分两者
# 如果保证URL中的目录名称规范,则无需此规则
RewriteRule ^/([^.]+[^/]$) /$1/ [L,R]

# 提取任意的二级域名名称(即第一个词汇)
# 用[a-zA-Z0-9_-]限制名称字符,重写Url到Home/子目录下
# 如 test.eboat.cn => web.eboat.cn/Home/test
RewriteCond Host: ([a-zA-Z0-9_-]+)\.eboat\.cn
RewriteRule ^/(.*) /Home/$1/$2 [I,L]

[ISAPI_Rewrite]
RepeatLimit 1
# Defend your computer from some worm attacks
RewriteRule .*(?:global.asa|default\.ida|root\.exe|\.\.).* . [F,I,O]

# 排除当前虚拟主机需要正常访问的域名(web.eboat.cn www.eboat.cn)
# RewriteCond Host: (?:web|www)\.eboat\.cn
# 多数情况下是一个,即当前提供二级域名服务的系统(如建站系统)
RewriteCond Host: web\.eboat\.cn
RewriteRule (.*) $1 [L]

# 解决不规范目录(末尾无/)的问题
# 但前提是目录名不含‘.’而文件名必须包含,否则无法区分两者
# 如果保证URL中的目录名称规范,则无需此规则
RewriteRule ^/([^.]+[^/]$) /$1/ [L,R]

# 提取任意的二级域名名称(即第一个词汇)
# 用[a-zA-Z0-9_-]限制名称字符,重写Url到Home/子目录下
# 如 test.eboat.cn => web.eboat.cn/Home/test
RewriteCond Host: ([a-zA-Z0-9_-]+)\.eboat\.cn
RewriteRule ^/(.*) /Home/$1/$2 [I,L]
==================================

 

ISAPI_Rewrite指令手册

1.AccessFileName指令
说明:设置分布式配置文件的名称
语法:AccessFileName filename [filename] …
默认值:AccessFileName .htaccess
使用环境:server config
指定一个ISAPI_ReWrite寻求分布式配置的文件名列表。默认文件名是.htaccess。ISAPI_ReWrite只能载入它能在这个列表中找到的第一个文件。默认情况下ISAPI_ReWrite管理者会以hidden属性标记配置文件-它将防止文件被远程用户直接访问到。
如果配置文件进行了任何修改,它将在下次请求服务器时自动加载。

2.AllowOverride指令
说明:明确规定了每个目录重写的基准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文件将对整个子目录树不可用。

3.RewriteEngine指令
说明:启用或禁用运行时Rewrite引擎
语法:RewriteEngine on|off
默认值:RewriteEngine off
使用环境:server config, virtual host, directory, .htaccess
启用或禁用运行时Rewrite。如果你需要禁用ISAPI_Rewrite模块或者特定的.htaccess文件,可以使用RewriteEngine off指令而不是注释掉重写规则。
警告:由于支持查询的号码,我们不得不使rewrite引擎在默认情况下打开,相较之Apache rewrite引擎在默认情况下关闭。请记住这个小小的不兼容,始终指定每个配置文件里的重写引擎的明确地位,无论你需要打开还是关闭。

4.RewriteRule指令
说明:定义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
Ÿ 服务器变量 %{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。

10.RewriteLog指令
说明:设置ISAPI_Rewrite日志文件的名称
语法:RewriteLog file-path
默认值:RewriteLog installdir\rewrite.log
使用环境:server config
这个指令用来设定记录ISAPI_Rewrite动作的日志文件的文件名。示例:
Rewritelog “C:\local\path\rewrite.log”

11.RewriteLogLevel指令
说明:设置日志级别
语法:RewriteLogLevel Level
默认值:RewriteLogLevel 0
使用环境:server config
这个指令设置日志的输出长度。默认值0表示不记日志,而最大的级别9则表示所有的动作都要记录。
使用使用较高的级别值可能会降低ISAPI_Rewrite的操作速度。我们建议你当你完成规则调试之后,通过设置日志级别为零来禁用日志。

12.RewriteOptions指令
说明:指定特殊选项
语法:RewriteOptions Options
使用环境:server config, virtual host, directory, .htaccess
这个指令可以为ISAPI_Rewrite设置特定选项。当前只有惟一一个选项可用:inherit。
inherit:强迫当前配置从父级继承所有的选项和规则。这意味着来自父级配置的所有的规则将被再次执行,除非当前环境另有相应重写规则。

13.RewriteCompatibility2指令
说明:启用或禁用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]标记的意思将由该指令倒置。

14.ErrorLog指令
说明:一般的错误文件的位置
语法:ErrorLog file-path
默认值:ErrorLog installdir\rewrite.log
使用环境:server config
这个指令设置存放ISAPI_Rewrite整体错误和消息的日志文件的名称。例如httpd.conf file load, .htaccess file load,等等
例:ErrorLog “C:local\path\error.log”

15.LogLevel指令
说明:设置一般的错误的日志级别
语法:LogLevel Level
默认:LogLevel warn
使用环境:server config
这个指令设置一般日志的输出长度,跟它的重写过程无关。这里有一个level的可用值列表:emerg、alert、crit、error、warm、notice、info、debug。当前的ISAPI_Rewrite日志只记录错误信息。
设置LogLevel调试来解决配置文件中加载的问题。

16指令
说明:把应用于特定IP地或者主机的指令编组
语法: …
使用环境:server config
… 标签用来对应用到特定虚拟主机里的指令进行分组。
addr的可用值为:
Ÿ 特定的IP地址
Ÿ 完整的域名
Ÿ 字符’*’可以匹配任何主机或者特定服务器的任何端口号。
例如:
RewriteEngine off
AllowOverride none

RewriteEngine on
AllowOverride all

不要忘了在每个标签中包含RewriteEngine on 指令,也不要将不能应用的规则封装进去。

17.指令
说明:将适用于特定的文件系统的目录和子目录的指令编组
语法: …
使用环境:server config, virtual host
… 标签被用来对应用到特定文件系统目录以及子目录的指令进行分组。通配符?和*是可用的。正则表达式也是可用的,需要以~字符打头。
对目录路径参数必须小心:它们必须字面匹配用来访问文件的文件系统路径,用于某一特定的指令并不适用于来自同一目录下通过不同的路径的文件访问,例如通过不同的符号链接。只有完整的文件路径是被允许使用的。
示例:

AllowOverride None

AllowOverride FileInfo

# … directives here …

不要忘了在每个标签中包含RewriteEngine on 指令,也不要将不能应用的规则封装进去。

18.指令
说明:将适用于特定的文件系统的目录和子目录的指令编组
语法: …
使用环境:server config, virtual host
… 被用来封装一个只适用于指定的文件系统的目录和子目录的指令组。这个指令和 语法相同。
示例:

# … directives here …

不要忘了在每个< DirectoryMatch>标签中包含 RewriteEngine on指令,也不要将不能应用的规则封装进去。

19. 指令
说明:将应用于匹配文件名的指令包装起来
语法: …
使用环境:server config, virtual host, directory, .htaccess
指令以文件名限定了封装的指令的作用域。filename参数必须包含一个文件名,支持?和*以及以~字符打头的正则表达式。
示例:

# … directives here …

# … directives here …

不要忘了在每个标签中包含RewriteEngine on 指令,也不要将不能应用的规则封装进去。

20.指令
说明:将应用于匹配文件名的指令包装起来
语法: …
使用环境:server config, virtual host, directory, .htaccess
指令的语法和语法完全一样。

不要忘了在每个标签中包含RewriteEngine on 指令,也不要将不能应用的规则封装进去。

21.指令
说明:把被包装起来的指令集应用到匹配的URL或者虚拟路径
语法: …
使用环境:server config, virtual host
… 标签用来将应用到特定URL或者虚拟路径的指令分组。将运算符完全从文件系统中分划出来,因此那些指令将不会用来控制对文件文件系统位置的访问。因为有几个不同的URL可能映射到相同的文件系统位置。
该URL-path是一个形式为“/path/”的虚拟路径。没有协议、主机名、端口号、查询请求字符串被包含在内。URL-path可以包含通配符?和*或者以~字符打头的正则表达式。
示例:

# … rules go here

# … more rules go here

不要忘了在每个标签中包含RewriteEngine on 指令,也不要将不需要用到的规则封套进去。

22.指令
说明:把被包装起来的指令集应用到正则表达式匹配的URL上
语法: …
使用环境:server config, virtual host
这个指令的语法和正则表达式语法完全一样。
示例:

# … rules go here

不要忘了在每个标签中包含RewriteEngine on 指令,也不要将不能应用的规则封装进去。

 

IIS ISAPI_Rewrite防盗链

[ISAPI_Rewrite]
RewriteCond Host: (.+)
RewriteCond Referer: (?!http://\1.*).*
#设置允许发起请求的网站,以|分隔
RewriteCond Referer: (?!http://(?:.*\.mydomain\.net|.*\.herdomain\.com)).+
#设置哪些扩展名的文件需要防盗链,以|分隔,注意各种符号细节
RewriteRule .*\.(?:gif|jpg|png|exe|rar|zip) /block.jpg [I,O,N]

注:

1. 设置受限文件格式.[I,O,N] 后面的 N 用来防止防问了盗链者网站后将block.jpg 缓存下来,正常访问你的站点仍然使用缓存的block.jpg就不好了。
2. 因为是通过判断Referer来达到防盗链的目的,而流媒体是不Referer的,所以流媒体的防盗链不适用本解决方案。
3. 增加对user agent判断的正则表达式规则,通过对user agent等特征判断达到对没有Referer的盗链的阻断目的。


 

点赞