AppConfig模块上线,Rewrite和压缩页面功能可以用了

AppConfig能做哪些事情?

AppConfig模块负责提供用户自定义web服务器配置的能力,目前可以自行配置的功能包括

  • 目录默认页面
  • 自定义错误页面
  • 压缩
  • 页面重定向
  • 页面过期
  • 设置响应Header的Content-Type

在哪里设置AppConfig选项?

在每个版本的目录下边,有一个叫做config.yaml的文件,只需要在里边追加handel段(绿色部分)即可,AppConfig采用基于yaml的自定义语法.
这里是来自sinat.sinaapp.com的一个例子:

name: sinat
version: 1
handle:
  - rewrite: if(!is_dir() && !is_file()) goto "index.php?%{QUERY_STRING}" #这里开头有两个空格

特别需要注意的是yaml里边的前置空格不能用TAB代替,否则会提示语法错误.

语法说明

AppConfig的语法分两种,一种是简单的参数罗列方式,一种是灵活的表达式语法,不同的功能会用到不同的类型的语法.

参数方式

目录默认页面

- directoryindex: file_list
file_list 中各个文件名以空格分隔,directoryindex 在 yaml 文件中仅有一项

例子:
- directoryindex: aaa.php bbb.html

自定义错误页面

- errordoc: httpcode error_file
httpcode 是诸如 404,302 之类的http响应码,error_file 是服务器以 httpcode 响应请求时响应的文件。errordoc 在 yaml 中可以配置多项。
- errordoc: 404 /path/404.html
- errordoc: 403 /path/403.html

表达式语法

其他功能需要用到表达式语法.其形式为:

if (expression) do_something

expression 有如下形式

  • in_header["header_name"] op string_or_digit
  • out_header["header_name"] op string_or_digit
  • path op string
  • query_string op string
  • is_file()
  • is_dir()

关于以上形式说明如下:

  • in_header 是请求 header,out_header 是响应 header,header_name 是 header 的名字
  • op 是操作符,有 ~(正则匹配) !~(正则不匹配) ==(相等,用于字符串和数字) !=(不相等,用于字符串和数字) > >= < <=(比较操作符仅用于整形数字)
  • string 是形如 “xxxx” 的字符串
  • string_or_digit 表示 string 或者 digit,根据 op 的种类,后面跟 string 或者 digit
  • path 是系统宏,表示用户请求的 url 去掉主机部分和查询串后剩下的部分
  • query_string 是系统宏,表示查询串
  • is_file() 和 is_dir 是系统函数,判断 path 是文件还是目录,!is_file(),!is_dir() 分别是其否定形式。

表达式语法用于以下功能.

压缩

- compress: if (single_express) compress
在 compress 中 single_express 表示单一的表达式,不能用 && 做复合,in_header,out_header,path 都可以出现在 single_express 中

例如:
- compress: if(out_header["Conteng-Length"] >= 500) compress
- compress: if(in_header["Referer"] == “gphone”) compress
- compress: if(path ~ “/big/”) compress

URL重写

- rewrite: if (complex_express) goto target_url

在 rewrite 中,complex_express 可以用 && 连接,组成复合表达式。除 out_header (没办法根据响应 header 做重定向) 外都可以出现在 rewrite 的 if 中,并且 path 只能出现一个(如果有多个,只有最后一个生效,其它被忽略),当省略 path 时,表示任意请求。
target_url 表示重定向的目标url,在target_url 可以以 $N 的形式表示 path 中匹配到的内容,%N 的形式表示最后一个query_string 中匹配到的内容,因为query_string 可以在 if 中出现多次,以%{QUERY_STRING} 表示查询串。

例如:
- rewrite: if(query_string ~ “^(so)$” && path ~ “zhaochou$”) goto “/url/%1″
- rewrite: if(is_dir( ) && path ~ “urldir/(.*)”) goto “/url/$1″
- rewrite: if( !is_file() && !is_dir()) goto “index.php?%{QUERY_STRING}”

指定过期时间和头信息

- expire: if (single_express) time seconds
- mime: if (single_express) type content-type
在 expire 和 mime 中 single_express 表示单一的表达式,不能用 && 复合,in_header,path 都可以出现在 single_express 中,并且 op 只能是 ~ 或者 ==,即只支持正则匹配和字符串比较
seconds 是秒数,content-type 是表示文档类型的字符串。

例如:
- expire: if(in_header["referer"] ~ “sina”) time 10
- mime: if(path ~ “\.pdf2$”) type “application/pdf”

更多的例子

为方便大家使用,zhiyong同学已经为大家把常用的语法写了示范.

目录默认页面

当访问url没有指定文件时,返回aaa.php,如果其不存在,则返回bbb.html

- directoryindex: aaa.php bbb.html

自定义错误页面

遇到 404 错误,返回 /path/404.html 文件。遇到 403 错误,返回 /path/404.html 文件

- errordoc: 404 /path/404.html
- errordoc: 403 /path/403.html

压缩

当页面内容大于 500 byte 时压缩
- compress: if(out_header["Conteng-Length"] >= 500) compress

当请求 header Content-Type 中包含 text 时压缩
- compress: if(out_header["Content-Type"] ~ “text”) compress

当响应 header Referer 等于 gphone 时压缩
- compress: if(in_header["Referer"] == “gphone”) compress

当请求的 url 包含“/big/” 时压缩
- compress: if(path ~ “/big/”) compress

注:对所有的压缩,请求 header Accept-Encoding 包含 gzip,deflate 是题中之意。

页面重定向

当 url 匹配 urldir/(.*) ,并且 输入 header referer 等于 sina 时,跳转至页面 /usr/$1,$1 表示刚刚匹配的 urldir/(.*) 中的 (.*) 部分。
- rewrite: if (path ~ “urldir/(.*)” && in_header["referer"] == “sina”) goto “/url/$1″

当 url 匹配 urldir/(.*),并且请求的是一个目录时,跳转至 /url/$1
- rewrite: if(is_dir( ) && path ~ “urldir/(.*)”) goto “/url/$1″

当 url 匹配 path,并且请求的不是一个文件时,跳转至 /url/query.php
- rewrite: if(! is_file() && path ~ “path”) goto “/url/query.php”

当查询串等于so,并且 url 以 zhaochou 结尾时,跳转至 /url/%1,%1 表示 query_string 匹配到的部分。
- rewrite: if(query_string ~ “^(so)$” && path ~ “zhaochou$”) goto “/url/%1″

当查询串不包含sohu,并且 url 以 zhaochou 结尾时,跳转至 /url/query.php?%{QUERY_STRING},%{QUERY_STRING} 表示查询串。
- rewrite: if(query_string !~ “sohu” && path ~ “zhaochou$”) goto “/url/query.php?${QUERY_STRING}”

如果 url 既不是文件,也不是目录,跳转至 index.php?%{QUERY_STRING}
- rewrite: if( !is_file() && !is_dir()) goto “index.php?%{QUERY_STRING}”

设置响应头的mime类型

如果 url 请求文件的扩展名是 pdf2,设置 Content-Type 为 application/pdf
- mime: if(path ~ “\.pdf2$”) type “application/pdf”

只要请求 header referer 包含字符串 sina,就设置 Content-Type 为 text/plain
- mime: if(in_header["referer"] ~ “sina”) type “text/plain”

页面过期

如果请求 header Referer 包含 字符串sina,设置过期时间10s
- expire: if(in_header["referer"] ~ “sina”) time 10

如果 url 以 lib\.js 结尾,设置过期时间100s
- expire: if(path ~ “lib\.js$”) time 100

在大量使用图片的应用中,给图片和js等静态文件加上过期设置能大大的节省显示时间,大家可以来体验下架设在SAE上的网页游戏-ogame.

所以赶紧给你的应用的静态文件加上过期设置吧,这样你的应用也能在Yslow里边拿到高分了 ^ ^

Comment

  • Trackback are closed
  • Comments (11)
  1. 功能不错

    PS:那个游戏 咋 不知道怎么玩呢?

    • Du Song
    • 03/19. 2010 2:58下午

    Awesome!

    • duofg
    • 03/19. 2010 3:25下午

    rewrite配置没有生效 不知道为什么,但是compress是生效的。

    name: lalatest
    version: 2
    handle:
    – compress: if(in_header["Accept-Encoding"] ~ “gzip|deflate”) compress

    – rewrite:if(!is_dir() && !is_file()) goto index.php?%{QUERY_STRING}

    • duofg
    • 03/19. 2010 3:27下午

    知道了
    原来rewrite的target_url一定要用引号引起来

  2. 终于等到了,尽管有点怪怪的

  3. 牛逼啊,强悍的说

    • 小明
    • 03/29. 2010 11:24下午

    为啥要搞一套自己的,学习成本很大啊
    为啥不用APACHE的地址重写模块的格式呢?

    怪了

  4. 没有邀请码的人,一直苦苦关注中…

  5. 什么时候能公开注册呀

  6. 如何配置文件的属性呢?

    • flying
    • 12/18. 2010 9:32上午

    学习能力很差!研究了半天没搞懂是很么意思,能不能给出一些实例啊,比如说像实现wordpress的固定链接静态页?

Comment are closed.