快捷搜索:  

ISAPI_Rewrite 3.1 教程中文版(4)

使用环境 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}

下列MapTypeMapSource的组合是可用的:
txt:纯文本映射,它的source是到一个可用的文本文档的windows文件系统路径。文本文档必须是如下格式的:

#This is a comment
key1 value1 #Another comment
key2 value2
keyN valueN

rnd:随机查找多个值。Source是一个文本文档的路径,文本文档必须是以下格式:

#This is a comment
key1 value1|value2|value3
key2 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 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> ... </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指令,也不要将不能应用的规则封装进去。

示例

注意:这些示例中所有的规则只适用于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.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$
顶(0)
踩(1)

您可能还会对下面的文章感兴趣:

最新评论