新浪 sae AppConfig 服务

/ 0评 / 0

服务概要

AppConfig服务是SAE为开发者提供的对web服务器进行自定义配置的功能,使用AppConfig,开发者可以很方便的实现以下功能:

  1.  目录默认页面
  2.  自定义错误页面
  3.  压缩
  4.  页面重定向
  5.  页面过期
  6.  设置响应头的content-type
  7.  设置页面访问权限

从上面的说明可以看出,AppConfig可以完全代替htaccess的常见功能,其实AppConfig正是SAE为了替代传统apache htaccess而实现的功能,原因有两点:

1. 传统htaccess效率不高,因为其针对所有目录进行递归merge
2. 传统htaccess过于复杂,学习成本高。AppConfig具有效率高而且学习成本低的特点,AppConfig只在App访问时针对根目录生成一次规则,而且AppConfig采用类自然语言的规则描述,开发者只需要参考几个简单的例子即可熟悉使用。

使用指南

例子:
appname: saetest
version: 1
编辑saetest/1/config.yaml,增加handle段,如:
name: saetest
version: 1
handle:
- rewrite: if(!is_dir() && !is_file()) goto "index.php?%{QUERY_STRING}"
编辑完成后,通过SVN代码部署工具提交即可生效。或者你也可以通过在线代码编辑器修改config.yaml
如果通过SVN部署,只需要在默认版本所在目录下,如,您的应用名为devapp,默认版本是3,那么请在devapp/3/下创建config.yaml文件,按下以下语法编写,然后通过svn commit部署完成即可生效。
语法说明
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 有如下形式:
1) in_header["header_name"] op string_or_digit
2) out_header["header_name"] op string_or_digit
3) path op string
4) query_string op string
5) is_file()
6) is_dir()
关于以上形式说明如下:
1) in_header 是请求头,out_header 是响应头,header_name 是 header 的名字,具体的请求头和响应头参考RFC官方文档
2) op 是操作符,有 ~(正则匹配) !~(正则不匹配) ==(相等,用于字符串和数字) !=(不相等,用于字符串和数字) >, >=, <, <=(比较操作符仅用于整形数字)
3) string 是形如 "xxxx" 的字符串
4) string_or_digit 表示 string 或者 digit,根据 op 的种类,后面跟 string 或者 digit
5) path 是系统宏,表示用户请求的 url 去掉主机部分和查询串后剩下的部分
6) query_string 是系统宏,表示查询串,一般是url中问号后面的内容
7) is_file() 和 is_dir 是系统函数,判断 path 是文件还是目录,!is_file(),!is_dir() 分别是其否定形式。

----------------------------------------华丽丽的分割线----------------------------------------

我在新浪SAE上搭建了一个yourls的网址缩短服务,由于新浪SAE不支持.htaccess, 只能靠AppConfig服务中的URL重写功能来实现。
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}"

----------------------------------------华丽丽的分割线----------------------------------------

比较安装自动生成的.htaccess规则
# BEGIN YOURLS
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/yourls-loader.php [L]
</IfModule>
# END YOURLS
最终我在Appconfig中的配置为
- rewrite: if( !is_file() && !is_dir() && path ~ "^(.*)
" ) goto "/yourls-loader.php"
备注和说明
更多页面重定向例子:
当 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}"
【FAQ】:

1. 如果有形如 path ~ "^(.*)$" 类的请求,一定要加上 is_file 或 is_dir 之类的判断,防止无穷的rewrite。
2. path 是用户请求的资源路径,比如请求 http://x.sinaapp.com/b/index.php?a=4,那么path就是 /b/index.php。
3. 在goto语句中,虽然某些时候可以不以/开头,但是强烈建议以/开头。

第三方工具
第三方开发的生成AppConfig的小工具 http://saetools.sinaapp.com/appconfig.html