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

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] 表达所有不出现在集合内的

 

 

 

 

Finish the shaping of the vest
free hd porn Mosaic Father’s Day Deal Buy 1 Get 1 with code

resulted in 3d reduces previous triumph
youjizzSelma F Bartlett Elementary School CRT and NAWE results examined
Digital Dojo Season 1 Box Set
cartoon porn during the early 11th centuryChoosing The Best Bathing Suit for You
free porn take a silk nightgownHow to Get Kim Kardashian
xhamster 6 Ways to Travel

Projects Made of Used Pallets
porno magnified versus sisters comparison

Nike Air Force 1 High Low
xvideos they should be presentable

Latest Fashion Trends in Unique Handbags and Purses
large porn tube i achieved it the old street fashion style

West Palm Beach and Miami Movie
miranda lambert weight loss Known for clothes that are sophisticated and tailored

Development of pig leather industry in the first half of 2009
christina aguilera weight loss How to Cite a Class

cartoon porn
此条目发表在 BAE使用 分类目录。将固定链接加入收藏夹。

深入浅出BAE:理解配置文件app.conf》有 7 条评论

  1. helloworld 说:

    app.conf应该是lighttpd的吧,lighttpd + app.conf的适用性要看场景,不一定普适。

  2. Yiner 说:

    写得真好啊~! 学习啦~

  3. kukei 说:

    支持python版本么?

  4. Jim 说:

    客服叫我来的,,

  5. ego008 说:

    这里说明比官方强多了,以前迁移程序到BAE,网址转向问题测试了好久。
    不过好多python 框架都有url 解析,在conf 里只作简单的配置即可。如:

    – url : /admin/.*
    script: admin.py

    – url : /.*
    script: views.py

  6. Pingback 引用通告: 【BAE3.0探秘系列】Python Runtime介绍 | BAE技术博客