深入浅出BAE:理解配置文件app.conf(转)

2013-12-21 admin 技术类

BAE环境中,每个应用对应一个配置文件app.conf,很多开发者在初次接触BAE的时候,对如何使用app.conf比较困惑,本文对app.conf做一个基本的介绍。

1. BAE环境中HTTP请求的处理流程

要理解app.conf的作用,首先要理解HTTP请求在BAE环境中是如何被处理的。

  • WEB请求首先到达前端 WEB proxy,WEB proxy负责将请求转发给后端的某一个WEB server。(注意,后端可能会有多个WEB server来处理应用的请求)
  • 请求到达后端 WEB server后,WEB server 根据 app.conf进行一些特定的处理,所以说app.conf主要是用来控制后端WEB server的处理逻辑的。app.conf的作用比较多,其中主要的功能是实现URL rewrite。
  • URL rewrite 完成后,原始的URL被改写, WEB server能根据改写后的URL识别出请求类型,
  • 对于静态请求,例如图片、模板、CSS文件、JS文件等,WEB server直接处理
  • 对于动态请求,例如PHP脚本、Python脚本等,WEB server进一步将其转发给后端的 Runtime去处理。
  • 后端Runtime根据请求,找到对应的处理脚本,例如index.php,执行脚本,并将处理结果返回给浏览器。

2. 用app.conf实现URL rewrite

  • 如何使用app.conf ,请先参看BAE配置文件
  • 关于 URL rewrite,可以参考URL rewrite
  • app.conf 采用的是 YAML格式,参考YAML
  • app.conf中,每条规则包括“规则类型”、“规则”和“执行”三个部分,“规则类型”中最重要的是“url”类型, 用来实现URL rewrite。 “规则”指定了URL匹配模式,“执行”指定了URL rewrite的结果; 若某个URL匹配了这个模式,则按照“执行” 对URL进行rewrite。
  • 规则是按顺序匹配的,一旦匹配上,就不往下继续匹配了。
  • “规则”和“执行”部分支持正则表达式,但使用的是LUA格式的正则表达式,详细的语法后面会介绍。

3. 你在设计app.conf 时要考虑的东西

  • 如何设计你的应用的URL的表现形式
  • 如何将URL请求路由到你的动态处理脚本
  • 区分动态请求和静态请求。对于静态请求,最好让后端WEB server直接处理,这样可以提高性能。

4. 你在设计动态脚本时要考虑的东西

  • URL被重写了,有些情况下,需要知道原始URL的信息,可以通过环境变量REQUEST_URI来获取

5. 示例

  • 示例一

如图所示,假设你开发了一个应用,希望把所有的静态文件,都放在应用的 /static 目录下,其它所有的URL,都统一转发给 index.php处理。

示例图中有两条规则,第一条规则,用来处理静态文件;第二条规则,用来处理动态脚本;
规则是按顺序匹配的,一旦匹配上,就不往下继续匹配了

(.*)是正则表达式里面的分组方式,例如URL为 http://xxx.duapp.com/static/f1.jpg ,那么 (.*) 匹配的是 f1.jpg, $1 表示第一个 (.*) 匹配的内容,这里只有一个,那就是 f1.jpg;

示例图中,有两个URL请求,

第一个是 http://xxx.duapp.com/aaa/bbb, 经WEB proxy转发后到达WEB server,WEB server根据app.conf 规则进行匹配,匹配到第二条规则,从而将其改写为  http://xxx.duapp.com/index.php, WEB server判断这是一个动态请求,继续向后转发给PHP runtime处理;PHP runtime找到应用目录下的index.php进行处理,并将结果返回给前端。

第二个是 http://xxx.duapp.com/static/xxx.jpg, 经WEB proxy转发后到达WEB server,WEB server根据app.conf 规则进行匹配,匹配到第一条规则,从而将其改写为  http://xxx.duapp.com/static/xxx.jpg(改写后的URL与原始的URL是一样的), WEB server判断这是一个静态请求,则自己到应用目录下的static子目录中,找到 xxx.jpg,将其内容返回给前端。

 6. app.conf 所用的正则表达式语法简介

BAE rewrite 采用的是 Lua 正则的规则。唯一不同在于将 Lua 正则的转义符号 % 替换成大家所熟悉的 \

可使用BAE规则检查器来检查你的规则

  • x    (这里 x 是指其不是这些转义字符 ^$()\.[]*+-? 之一) — 其代表了这个字符本身.
  • . 代表任何字符
  • * 与普通正则一致,贪婪匹配,即{0,}
  • + 与普通正则一致,贪婪匹配,即{1,}
  • - 非贪婪匹配,即 *?
  • ?  与普通正则一致,贪婪匹配,即{0,1}
  • \n  n 为1到9之间的数字,用于表示捕获的分组,类似与 \1
  • ^ 当在正则表达式开头时,表示匹配字符串起始位置,否则视为普通字符^
  • $  当在正则表达式结尾时,表示匹配字符串结束位置,否则视为普通字符$
  • \a 代表任何字母. 即[a-zA-Z]
  • \c 代表任何的控制字符暂不支持
  • \d 代表任何的数字字符. 即[0-9] 或 \d
  • \l 代表所有的小写字母. 即[a-z]
  • \p 代表所有的标点符号字符暂不支持
  • \s 代表所有空格,tab 字符
  • \u 代表所有的大写字母. 即[A-Z]
  • \w 代表所有的字母数字. 即[a-zA-Z0-9] 或 \w
  • \x 代表16进制数字,类似于 \x,后面需要紧跟两位16进制数字
  • \z 代表字符值是 0 的字符. 注意:值为0 的字符是无法正常表达的在表达式中,如果你要使用他,请使用 \z暂不支持
  • \x (x是任何非字母和数字的字符)代表字符 x. 这是一种标准的方式来代表应用转义字符. 任何标点符号字符(即使不是转义字符) 在其前面添加一个 \ 可以用来表示其自己 例如 \\ 表示 \ , \$ 表示 $
  • [set] 代表一个字符集合. 如果要表达一个范围集合,在范围开始的字符和结尾的字符之间使用 – , 例如要表达 3,4,5,6 这个集合 可以用 [3456] ,也可以用 [3-6] .上面提到的 \x 也可以用到集合中. 例如, [\w_] 表达所有的字母和数字加一个下划线
  • [^set] 表达所有不出现在集合内的


发表评论:

Powered by emlog

浙ICP备17021512号 |浙公网安备 33010602008237号