新浪SAE下 riwrite重寫規則詳解

AppConfig模塊上線,Rewrite和壓縮頁面功能能夠用了

  • 03/19. 2010php

AppConfig能作哪些事情?

AppConfig模塊負責提供用戶自定義web服務器配置的能力,目前能夠自行配置的功能包括html

  • 目錄默認頁面git

  • 自定義錯誤頁面web

  • 壓縮express

  • 頁面重定向服務器

  • 頁面過時app

  • 設置響應Header的Content-Type函數

在哪裏設置AppConfig選項?

在每一個版本的目錄下邊,有一個叫作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

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

相關文章
相關標籤/搜索