深刻淺出BAE:理解配置文件app.conf

BAE環境中,每一個應用對應一個配置文件app.conf,不少開發者在初次接觸BAE的時候,對如何使用app.conf比較困惑,本文對app.conf作一個基本的介紹。 php

1. BAE環境中HTTP請求的處理流程

要理解app.conf的做用,首先要理解HTTP請求在BAE環境中是如何被處理的。 html

  • 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進行處理,並將結果返回給前端。 app

第二個是 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規則檢查器來檢查你的規則 url

  • 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] 表達全部不出如今集合內的
相關文章
相關標籤/搜索