03/19. 2010php
AppConfig模塊負責提供用戶自定義web服務器配置的能力,目前能夠自行配置的功能包括html
目錄默認頁面git
自定義錯誤頁面web
壓縮express
頁面重定向服務器
頁面過時app
設置響應Header的Content-Type函數
在每一個版本的目錄下邊,有一個叫作config.yaml的文件,只須要在裏邊追加handel段(綠色部分)便可,AppConfig採用基於yaml的自定義語法.
這裏是來自sinat.sinaapp.com的一個例子:url
name: sinat version: 1 handle: - rewrite: if(!is_dir() && !is_file()) goto "index.php?%{QUERY_STRING}" #這裏開頭有兩個空格spa
1 2 3 4 |
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
- 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}」
若是 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