ISAPI_Rewrite 中文手册2

ISAPI_Rewrite
正式指令

4.1AccessFileName

指令

说明

设置分布式配置文件的名称

语法

AccessFileName filename

[filename] ...

默认值

AccessFileName .htaccess

使用环境

server config

指定一个
ISAPI_ReWrite
寻求分布式配置的文件名列表。默认文件名是
.htaccess

ISAPI_ReWrite
只能载入它能在这个列表中找到的第一个文件。默认情况下
ISAPI_ReWrite
管理者会以
hidden

属性标记配置文件
-
它将防止文件被远程用户直接访问到。

如果配置文件进行了任何修改,它将在下次请求服务器时自动加载。

4.2AllowOverride
指令

说明

明确规定了每个目录重写的基准
URL

语法

AllowOverride Al

l|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.3RewriteEngine
指令

说明

启用或禁用运行时
Rewrite
引擎

语法

RewriteEngine on|off

默认值

RewriteEngine off

使用环境

server config, virtual host, directory, .htaccess

启用或禁用运行时
Rewrite
。如果你需要禁用
ISAPI_Rewrite
模块或者特定的
.htaccess
文件,可以使用
RewriteEngine off
指令而不是注释掉重写规则。

警告:由于支持查询的号码,我们不得不使
rewrite
引擎在默认情况下打开,相较之
Apache  rewrite
引擎在默认情况下关闭。请记住这个小小的不兼容,始终指定每个配置文件里的重写引擎的明确地位,无论你需要打开还是关闭。


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
兼容。如果使用了
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
指令

 

 

说明

设置
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.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
里使用。

ISAPI_Rewrite中文手册

 

 

安装和反安装

 

 


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 扩展

2.2安装程序

在运行安装包之前请先阅读系统要求部分。下载并安装某个版本的ISAPI_Rewrite.msi,依照安装向导的说明操作。安装过程是自动的,并有自我描述。ISAPI_Rewrite在自动安装过程中必须重启IIS。下列服务必须被重启:IISADMIN、W3SVC。不需要手工把任何ISAPI筛选器或者扩展加入到网站或者全局列表中。它能够在安装和配置过程中自动完成。

命令行安装

ISAPI_Rewrite也能够通过命令行进行后台安装。请使用以下命令行语法来安装:

msiexec /i ISAPI_Rewrite3.msi /qn AcceptEULA=Yes REGISTRATIONCODE=Code REGISTRATIO

NNAME=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 name

RegistrationCode=REG-CODE-PROVIDED-FROM-HELICON

依照“运行ISAPI_Rewrite的权限需求”这一部分的说明来检查文件系统权限。

2.4反安装

反安装程序会删除所有安装程序所生成的文件、从管理元库中注销筛选器,并删除所有由安装程序所添加的其它管理元库变化。如果用户决定在反安装过程中保留用户文件的话,下列用户数据文件在反安装后会被留下来。

文件名

说明

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应用程序的属性中给予一个“纯脚本”的执行权限。

 

 

使用ISAPI_Rewrite
3.1基本概念
ISAPI_Rewrite提供了一个基于规则的重写引擎能飞速重写被请求的URL。它支持几乎无限量的规则和几乎无限量的附加规则条件来提供真正灵活和有效的URL处理机制。可以根据HTTP头、服务器变量、被请求的URL本身以及其它不同的条件的测试结果来对URL作出处理。

URL数据处理是用一个文本配置文件来定制的,内含各种指令设置。配置分几种等级。首先是全局(服务器范围的)配置指令,放置在ISAPI_Rewrite安装目录里的一个名为httpd.conf的文件里。那里还有若干个标签可以封装应用到特殊位置的指令:<VirtualHost>、<Directory>、<DirectoryMatch>、<Files>、 <FilesMatch>、<Location>以及<LocationMatch>。最后ISAPI_Rewrite支持可以放在任何网站目录里的.htaccess文件,那些文件中的规则可以应用到该位置以及它的子目录中。所有的配置文件在每次修改文件后都会被自动重载。允许用第三方程序和脚本来修改文件。

在很多情况下ISAPI_Rewrite是用来重写URL的。除了重写之外,ISAPI_REWRITE能够修改、生成、删除任何其它客户端Request中的HTTP头。模块操作可以载入改写、代理、重定向或者阻断原始客户端到服务器的请求。

Rewriting可能使服务器在得到了一个客户端的源请求时用一个新的URL继续请求处理。新的URL可以包括查询串部分(跟在问号后面),也可以指向任何一个完全的静态文件或者脚本(例如asp)、或者程序(例如.exe),等等。对用户和网站配置来说重写是彻底透明的。因为它Web应用程序收到请求之前在服务器内部执行。

Proxying使URL经过内部处理后指向另一台服务器,并很快传递到远程服务器上(换言之,规则处理在这里中止了)。远程服务器的响应很快被传回客户端。代理服务器要求你指定完整的有效URL,以协议、包括主机名开头等等。ISAPI_Rewrite使用ISAPI扩展来处理代理请求,你可以在“代理服务器配置”这一章里读到更多信息。

Redirection将发送一个带有重定向指令的即时响应(HTTP响应码为302或者说301),将网址设置为一个新的位置。您可以在重定向指令里使用绝对URL格式(这是RFC2616所要求的)将请求重定向到不同的主机、端口和协议。如果此信息被忽略, ISAPI_Rewrite将自动照当前的协议、服务器名称和目录位置提供URL。重定向指令总是导致重写引擎中止处理后面的规则序列。

每个规则按它在配置文件中出现的顺序来应用。目录级配置文件从父路径开始一个接一个地处理,来自于全局配置文件的规则最先适用。

在修改URL之前ISAPI_Rewrite会保存原URL到Http头,命名为X-Rewrite-URL。然后它能够在脚本中作为HTTP_X_REWRITE_URL服务器变量取回。因为在IIS里,系统变量名不能被修改,所以ISAPI_Rewrite不能提供与Apache兼容的变量名REQUEST_URI。如果你的应用程序的设计要依赖于REQUEST_URI变量,你必须修改它,用HTTP_X_REWRITE_URL变量来代替。下面是一个PHP代码补丁的示例:

if (isset($_SERVER['HTTP_X_REWRITE_URL']))

{

$_SERVER['REQUEST_URI'] = $_SERVER['HTTP_X_REWRITE_URL'];

}

后面跟有RewriteRule(或者RewriteProxy)指令的多重RewriteCond指令只影响单个规则。如果一些条件需要被用于多个规则,必须重复写这些条件指令以应用到每条规则上。

3.2和Apache下mod_rewrite的兼容性
这个版本的ISAPI_Rewrite是为了最大程度上保持与Apache的mod_rewrite的兼容性。这个目标已经很大程度上实现了,尽管有一些功能无法执行,因为它们和Apeach以及UNIX结构高度绑定,而且它们在IIS上执行是不敏感的。举例说明:第H条:“强制内容处理”标记不能执行,因为在IIS中内容处理的范围依赖于扩展名。或者第[NS]条:“没有子请求”标记是无意义的,因为在IIS中是没有子请求的。

这里有一个完整的ISAPI_Rewrite和mod_rewrite兼容性图表。标记为绿色的功能或指令是充分支持的,黄色的功能是部分支持或计划在下一版本中支持,标示为红色的功能是不支持的。

·   兼容Perl的正则表达式 (plus extended syntax)

·   服务器级httpd.conf配置

·   虚拟网站.htaccess配置文件

·   目录.htaccess配置文件

·   <VirtualHost>

·   <Directory>

·   <DirectoryMatch>

·   <Files>

·   <FilesMatch>

·   <Location>

·   <LocationMatch>

·   AccessFileName

·   RewriteEngine

·   RewriteRule

o  $N 规则后向引用

o  %N RewriteCond 后向引用

o  ${mapname:key|default}

o  %{VARNAME} 服务器变量

o  '!' 取非

o  [C] 与下一个规则联锁

o  [CO=name:val:domain:lifetime:path] 设置cookie

o  [E=var:val] 设置环境变量

o  [F] 强制禁止应答

o  [G] 强制继续应答

o  [H=content-handler] 明确的内容处理 (不适用)

o  [L] 上一个规则标记

o  [N] 再次应用规则

o  [NC] 大小写不敏感

o  [NE] 不转义输出

o  [NS]非内部子请求

o  [P]代理通过

o  [PT] 传递通过下一个处理程序 (一直开启)

o  [QSA] 追加查询字符串

o  [R =code] 重定向

o  [S=num] 跳到下面第 n 条规则

o  [T=MIME-type] 强制明确应答 MIME 类型

·   RewriteCond

o  [NC] 大小写不敏感

o  [OR] 逻辑并集

o  %{HTTP:header}

o  '!' 非

o  '<CondPattern' 大于比较符

o  '>CondPattern' 小于比较符 

o  '=CondPattern' 等于比较符

o  '-d' 目录存在

o  '-f' 文件存在

o  '-s' 非零文件

o  '-l' 符号链接

o  '-x' 有可执行权限的文件

o  '-F' 通过子请求文件存在

o  '-U' 通过子请求URL存在

·   RewriteBase

·   RewriteMap

o  txt: 文本映射

o  rnd: 随机映射

o  int: 内部函数 toupper, tolower, escape, unescape

o  prg: 外部程序

o  dbm: 散列文件

·   RewriteLog

·   RewriteLogLevel

·   RewriteOptions

·   RewriteLock

·   AllowOverride

3.3使用环境以及处理顺序
以下是这个程序文档中要被用到的使用环境的详解:

server config

这个标志表示该指令可以用在全局httpd.conf配置文件中,但是不能用在任何一个分区(例如<Virtualhost>或者<Directory>)内部。它不允许放在.htaccess文件中。

vitrual host

这意味着指令可以出现在<VirtualHost>容器内。

directory

这个标志表示指令在<Diretory>、<Location>、<Files>容器内可用,而且它们的正则表达式是等价的。

.htaccess

使用环境标为它的指令可以出现在每个目录的.htaccess文件中。 记住当RewriteRule指令用在.htaccess配置文件中时,它将自动从路径中剥去本地目录前缀,只对剩下的部分应用规则。你可以使用RewriteBase指令显式地给这些规则指定一个基本路径。

应用次序

当同一分区内的多条指令同时适用时,理解每个分区应用的次序是很重要的,因为它会对最终效果起作用。应用次序如下所述:

1.<Directory>(正则表达式除外):多个<Directory>分区可以应用于单个请求,如果多个(非正则表达式)<Directory>分区匹配了包含文档的这个目录(或者它的上级目录中的一个),则按照从短到长的匹配次序应用指令。

2..htaccess文件按父目录到子目录的顺序应用。

3.<Files>和<FileMatch>同时被执行。

4.<Location>和<LocationMatch>也同时被执行。

先应用虚拟主机外面定义的相应分区和指令,再应用<VirtualHost>分区中的分区和指令。同一时间只有一个<VirtualHost>分区可以应用给请求。较晚的分区优先于较早的那些。

 

提高网站页面流量的方法

本文介绍的方法针对于blog的,但是对于一般的网站,想提高页面的访问量同样适合的!
  如何增加Blog的访问量已经是老生长谈了,其实对于blogger来说另一个统计数也至关重要:页面浏览量。

  很多的网站流量统计服务会同时提供这两项数据- “访问量”计数的是访问者的数目,而页面浏览量算的则是这些访问者所浏览的你blog上的网页的数目。
  对不同blog来说,每个访问者的页面浏览量会有所不同,但希望这个数字可以大一总不是件坏事:
  回头率: 读者浏览的页面越多,那么他再次造访的可能性也就更大。
  收入:放在blog上的广告多是印象型的,也就是说被浏览的次数多了,被点击的可能性才越大。

写blog的目的不同,所以想不想把增加页面浏览量放在第一位悉听尊便。对于那些希望这项统计值上升的人,这里有14条建议:1、内链到自己的文章
  这可能是最简单的增加页面流量的办法,那就是在自己文章里加入链接,指向自己的其它文章。自卖自夸可能有点好笑,不过如果是链接到一些之前写过的相关或相同主题的文章的话,相信还是读者们所喜闻乐见的。很多的blogger在自己的blog上会多次写到同一主题,把这些文章都链到一起无疑会显出你对这个主题的探讨深度。
2、高亮显示相关的文章
  不想在文章内部加入指向之前文章的链接的话,专门独立出一个“相关文章”(Related post)的部分就不失为一个好的替代方法了(你可以在侧栏里看到我的相关文章(related entries),而原文作者,ProbBlogger的主人的相关文章则放在了每篇文章之后,并以黄色为背景以突出显示)。Wordpress有专门的插件可以自动实现这一功能(名为related posts)。当然你要是想手动实现也是可以的,只要在文章结尾处加进一些和本文相关的可供读者参考的文章链接就可以了。

3、加入一个邮件订阅或文章更新提提示服务
  原文作者就尝到了通过邮件订阅来提高页面浏览量的甜头,凡是通过邮件订阅的读者在收到ProBlogger的最新消息的同时都会留意到一个叫作“hot posts”的部分,在这个部分中整理收入了一周当中的最受欢迎的5篇文章。因为不同读者所关注的文章不同,所以很可能一些人只看过其中的某几篇文章,加入“hot posts”之后,这部分读者就会对没看过的那些文章产生兴趣。这样一来就在增加“访问量”的同时也增加了“页面浏览量”。其它的一些通过邮件提示更新的订阅服务应该也很有效(比如Zookoda和Feedburner就都有这个功能)。
4、在醒目位置高亮显示重要文章
  ProBlogger在页面的上部有三个高亮显示的菜单栏,里面放置了一些介绍或提示性质的文章,比如什么是blog,blog设计的窍门之类。而通过作者的观察很多读者都会认真地把这里的文章看过一遍。这样一来无疑就提高了页面量。

5、“几大……”
  这种“最…”或是“几几大…”的链接到多个页面的文章似乎总是会勾起读者的兴趣。比如“二十大最受欢迎文章”往往就成为初次造访的读者必看的文章,而这又指引着他们挨着个地去看,不失为一个好办法。
6、写一个系列
  写一系列的文章来提高页面量有着两层意义。首先在写这个系列的这段时间里,读者会不时地被吸引回来,因为他们想看看你下一篇文章写了些什么; 其次,在你完成了这个系列之后,如果能很好的把这些文章都链在一起(参考1和2),这样一来读者就会从头到尾读完整个系列(当然是由多个页面组成的)。原文作者就写过一个初学者blog指南的系列,而每个从头到尾看完这个系列的读者都要看上30到40篇文章(汗)。
7、在首页上输出摘要
  在首页上只输出摘要或是只输出文章的一部分,然后通过一个“阅读完整文章”的链接链到单独的页面,这样一来想看完整文章的就得再去单独的页面。不得不说这样一来会很烦人,所以很多人都不这么做。不过对于篇幅长的文章来说,这么做不仅使首页看起来更严谨,也在无形中增加了页面量。
8、企划或专题
  和之前的系列文章相类似,比如很多主题(theme)设计者的blog就是通过建立某个主题的企划,从而吸引关注这个主题的人不时地来看看工作的进展情况。类似的比如开展讨论或者竞赛也可以达到相同的效果。不过这些牛人做这个的首要目的并不是区区页面量,页面量不过是副产品罢了。
9、在聚合中只输出摘要
  这是为我所不耻的。就连原文作者也不这么做。尽管这样一来你的页面访问可能会有所上升,但我觉得无论是对于读者还是作者来说都是得不偿失。在这样一个“你有压力,我有压力”的社会,每个人的时间都很宝贵,用聚合的目的就是节省时间和资源。所以我看到只输出摘要的blog就一个反应,把它从我的bloglines里删除。强烈建议所有的blogger都在聚合里都输出完整的文章!
10、诱使聚合读者访问页面
  相比起输出摘要的做法,我觉得这个更可取。不是通过强迫,而是通过一些技巧,比如投票,吸引读者参与评论,或是内部链接的方式来把读者带到你的页面上来。
11、互动
  读者参与的越多,回访的机率也就越大,同时页面量也就越多。参与了评论或是投票的读者很多都会回访,来看看其他人的回应。而回应本身就带来了两次页面访问量。就留言评论来说,看一遍文章就是一次页面访问,而留个言就是又一次。同样的,最好不要把这个当成吸引留言的首要目的,交流才是根本啊。互动主要发生在留言部分,当然投票以及其它的工具也应该有效果。
12、吸引读者的评论
  有几个方法可以有效地达到这个目的:比如通过插件实现在侧栏里显示最新的评论,为评论提供一个专门的聚合,或是提供邮件订阅评论的选项。
13、搜索
  通过加入搜索功能从而方便读者检索你之前写的文章也可以提高页面量。有很多方法可以实现这一功能。大多数的主题都内建了一个搜索引擎,Google的AdSense也提供了这样的一个服务,读者可以选择搜索本站或是整个网络,而且如果他们在搜索结果页面点击了广告,那么还可以给你带来一点小小的外块。
14、给你的读者留作业
  原文作者举了他的一个提供摄影技巧的blog为例,因为是为读者提供一些摄影的窍门,所以在文章的结尾布置一些“作业”以便让读者可以亲自去尝试就显得十分自然了。这样一来读者就会经常回访,一方面这种窍门或是教学多是一步步的,所以他们会经常打开你的页面,反复按照你的指导一步步地去做;另一方面,很多人都会想要向你展示一下他们的作业成果。