ISAPI_Rewrite
正式指令
4.1AccessFileName
指令
说明 |
设置分布式配置文件的名称 |
语法 |
AccessFileName filename |
默认值 |
AccessFileName .htaccess |
使用环境 |
server config |
指定一个
ISAPI_ReWrite
寻求分布式配置的文件名列表。默认文件名是
.htaccess
。
ISAPI_ReWrite
只能载入它能在这个列表中找到的第一个文件。默认情况下
ISAPI_ReWrite
管理者会以
hidden
属性标记配置文件
-
它将防止文件被远程用户直接访问到。
如果配置文件进行了任何修改,它将在下次请求服务器时自动加载。
4.2AllowOverride
指令
说明 |
明确规定了每个目录重写的基准 |
语法 |
AllowOverride Al |
默认值 |
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.3RewriteEngine
指令
说明 |
启用或禁用运行时 |
语法 |
RewriteEngine on|off |
默认值 |
RewriteEngine off |
使用环境 |
server config, virtual host, directory, .htaccess |
启用或禁用运行时
Rewrite
。如果你需要禁用
ISAPI_Rewrite
模块或者特定的
.htaccess
文件,可以使用
RewriteEngine off
指令而不是注释掉重写规则。
警告:由于支持查询的号码,我们不得不使
rewrite
引擎在默认情况下打开,相较之
Apache rewrite
引擎在默认情况下关闭。请记住这个小小的不兼容,始终指定每个配置文件里的重写引擎的明确地位,无论你需要打开还是关闭。
4.4RewriteRule
指令
说明 |
定义 |
语法 |
RewriteRule Pattern Substitution |
使用环境 |
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 |
十六进制字符,比如说 |
\x{} |
一个可能的 |
\cx |
ASCII |
\e |
The ASCII |
\dd |
八进制字符常量,例如 |
\l |
导致下一个字符被小写输出。 |
\u |
导致下一个字符被大写输出。 |
\L |
导致整个后继字符串被小写输出,直到遇到 |
\U |
导致整个后继字符串被大写输出,直到遇到 |
\E |
结束 |
\\ |
单个反斜杠字符 |
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
兼容。如果使用了
RewriteCompatibility
2
,这个指令在处理之前将
URL
规范化。规范化包括移除一个
URL
编码、错误字符,等等。同时
URL
的规范化将完全移除它的查询字符串。如果
RewriteCompatibility
2
没有被使用,
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.10RewriteLog
指令
说明 |
设置 |
语法 |
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
指令
说明 |
启用或禁用 |
语法 |
RewriteCompatibility2 on |
默认值 |
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 |
默认值 |
ErrorLog |
使用环境 |
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>
指令
说明 |
把应用于特定 |
语法 |
<VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost> |
使用环境 |
server config |
<VirtualHost> ... </VirtualHost>
标签用来对应用到特定虚拟主机里的指令进行分组。
addr
的可用值为:
特定的
IP
地址
完整的域名
字符
'*'
可以匹配任何主机或者特定服务器的任何端口号。
例如:
RewriteEngine off
AllowOverride none
<VirtualHost onesite.com
www.onesite.com
>
RewriteEngine on
AllowOverride 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 |
使用环境 |
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 |
使用环境 |
server config, virtual host, directory, .htaccess |
<FilesMatch>
指令的语法和
<Files ~>
语法完全一样。
<FilesMatch "\.(gif|jpe?g|png)$">
不要忘了在每个
<FilesMatch>
标签中包含
RewriteEngine on
指令,也不要将不能应用的规则封装进去。
4.21<Location>
指令
说明 |
把被包装起来的指令集应用到匹配的 |
语法 |
<Location URL-path|URL |
使用环境 |
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>
指令
说明 |
把被包装起来的指令集应用到正则表达式匹配的 |
语法 |
<LocationMatch regex |
使用环境 |
server config, virtual host |
这个指令的语法和
<Location ~>
正则表达式语法完全一样。
示例:
<LocationMatch "/(home|section)/bin">
# ... rules go here
</LocationMatch>
不要忘了在每个
<LocationMatch>
标签中包含
RewriteEngine on
指令,也不要将不能应用的规则封装进去。
示例
注意:这些示例中所有的规则只适用于
httpd.conf
文件。在
ISAPI_Rewrite
以及在
Apache
的
mod_rewrite
中,规则的基本路径是不同的,取决于你放置
.htaccess
文件的目录。如果你将规则放在
httpd.conf
里的话,初始领头斜线必须存在,而在
.htaccess
文件中,到这些文件的虚拟路径会被截断。规则取决于以
RewriteBase /
指令引导的根路径,来允许它们在
httpd.conf
和目录级的
.htaccess
文件的任何位置上运作。
简单的搜索引擎友好的网址
下面这个例子演示了如何轻松地使用循环标记藏匿查询字符串参数。假设你有一个如下的
URL
:
http://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
.把所有的页面相对链接都变成相对于根目录的地址或者绝对地址形式。
还存在着很多种用了不同的分隔符和文件扩展名的规则。例如,使用像这样的
URL
:
http://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.asp
,
URL
中的关键词
“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.com
和
www.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.com
和
www.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.com
和
http://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
里使用。