[重写] Zeus Web Server 上的URL重写指南[基本完成]
HonestQiao
|
1#
HonestQiao 发表于 2006-12-26 23:14
[重写] Zeus Web Server 上的URL重写指南[基本完成]
[重写] Zeus Web Server 上的URL重写脚本
Zeus的重写相对Apache来说,要简单一些,而且流程相对清晰。 但是有一个限制,他仅仅针对URL的pathname部分,也就是URL之中的目录和文件部分,并且重写为当前domain的另外目录或者文件,而不能重写到其他的domain或者其他的本地文件。这一点相对于Apache来说,功能减弱了很多,不过Zeus也有一些相关的补救措施,例如Subserver等。 上面这段的简短示例就是,可以把http://www.gaogao8.com/dir_a/file_1.php之中的/dir_a/file_1.php重写为/path_b/file_2.html,但是不能重写为http://www.gaogao9.com/或者/home/www.gaogao9.com/(这里是绝对路径)之下的文件。 不过,它可以使用重写规则,将URL转向另外一个domain下的网址,但是是发给客户端,又客户端再次请求新的网址。 Zeus的重写规则一般如下:
[Copy to clipboard] [ - ]
CODE:
match URL into $ with ^/dir/(.*)\.php
if matched then set URL=/newpath/$1.html endif 其意义非常明确,如果匹配,就做什么操作。这里相对Apache的重写来说,也有一个好处,做什么操作这个地方,可以有多行操作(当然,Apache也可以接连的执行重写规则,但是和这里是不同的)。一行一行的写,看起来至少容易理解。而且它要求必须是一行一个操作。 Zeus的重写指令之中,是大小写无关的,不过手册建议,关键词使用小写,变量名和标签使用大写。 Zeus的重写规则之中,有几个关键的信息:关键字、变量、字符串、标签。 Zeus重写之中,变量用于存储字符串,可以保存单个字符串,也可以保存一个字符串数组。例如当前网址URL,是一个网址字符串,而SCRATCH这样子的变量,就是一个数组,它可以有path和file这样子的元素。 可用的变量如下:部分变量是只写的,不可读取内容,它用于设置信息进行操作
[Copy to clipboard] [ - ]
CODE:
URL 用户请求的网址的pathname部分,可被重写为新的pathname
REMOTE_HOST 客户端的hostname或者ip(DNS无效时) REMOTE_ADDR 客户端的ip REMOTE_USER 在有认证时,是客户的用户名 REQUEST_METHOD 请求方法,例如GET、POST,它是只写的,不可重写改变 ENV 字符串数组,包含操作系统的变量,可以设置值或者添加新的值,它是只写的。 IN 字符串数组,包含HTTP请求头信息,可被重写改变头信息 OUT 字符串数组,在请求完成时,它保存发送给用户的HTTP头信息;初始是空的。它是只写的。 SCRATCH 字符串数组,可以用来保存临时数据,请求结束时,数据清空。 NOTES 字符串数组,可以用来存储备注信息,可以用来保存到日志,也可以通过API被程序读取操作 BODY 用于替换发送给用户的页面内容,发送之后Zeus就会断开连接,它是只写。 RESPONSE 如果BODY设置了,它可以设置为发给客户端的HTTP响应代码。 Zeus的关键字也就是指令,包含以下指令:
QUOTE:
path 表示获取URL相对路径的实际文件路径。例如网站根目录为/var/www/www.test.com,则URL相对路径为/时,变量的值将是/var/www/www.test.com/。 mime 表示获取URL相对路径所对应的文件的MIME类型,例如是/test/index.html,它将获取.html的MIME类型,也就是text/html 变量 存储从path或者mime获取的字符串值,如果获取失败则为空;存储到SCRATCH之中,例如SCRATCH:mypath URL相对路径 也就是网址中的pathname部分。也可以使用一个变量 这个指令,简单来说,就是获取所访问的文件的本地文件系统路径或者MIME类型。
从前面的介绍,我们可以得知,重写基本上是对字符串的操作,或者是保存了字符串的变量。在Zeus的重写之中,字符串里面可以嵌入变量,使用%{}来嵌入一个变量,例如:
[Copy to clipboard] [ - ]
CODE:
/var/www/%{IN.Host}/public_html
你也可以将匹配结果$1~$9或者%1~%8嵌入。 上面有一个goto指令,用于跳转到标签;标签可以使用大小写字母、数字、下划线或者减号定义,一般形式如下:
[Copy to clipboard] [ - ]
CODE:
LABEL:
:是必须的,表示这是一个标签,而且标签所在行不能有其他的操作指令。 标签可以放在脚本的任何地方,你爱怎么跳转就怎么跳转,只要不转来转去转晕头就成。 另外,还有两个预定义的标签,BEGIN:和END:,这两个标签是自动定义的,一个在所有规则最前面,一个在所有规则最后面,使用goto END可以结束所有规则。你不能覆盖这两个标签的定义。 通过标签的跳转,可以使得部分重写规则不被执行,如果你想保留这些规则在脚本之中,但是有暂时不打算执行,你可以直接在规则前后应用goto和标签来跳过,也可以把这些规则注释掉,类似Apache,#用来将一行注解掉,当然,在注解行,你也可以写一些备注的信息。 goto可以在规则之间调来调去,如果你学过早期的BASIC的话,可以使用goto来实现一些小的函数功能,这里我们就不说了。 另外,规则也是可以相互嵌套的,例如if之内,好可以嵌套一个if,形成多重条件判断。不过记住,每次match或者look以后,原有的exists或者matched都会被置为无效的,这点需要注意。 |