三、SAE空间自定义 web 服务器配置语法
1、Appconfig提供了强大的Web服务器配置,实际上这也是将SAE打造为PHP空间的有力工具,掌握好这些语法可以帮助我们更好地来使用新浪SAE空间。
2、目录默认页面:当访问url没有指定文件时,指定返回的文件。
语法:
- directoryindex: FILE [...]
directoryindex在config.yaml文件中仅有一项
例子:
- directoryindex: aaa.php bbb.html
3、自定义错误页面。
语法:
- errordoc: httpcode error_file
httpcode是诸如404、302之类的http响应码,error_file是服务器以httpcode响应请求时响应的文件。errordoc在config.yaml中可以配置多项。
例子:
- errordoc: 404 /path/404.html - errordoc: 403 /path/403.html
4、压缩
语法:
- compress: if (CONDICTIONs) compress
在compress中,CONDITIONs只能有一个CONDITION。
例子:
- compress: if (%{RESP:Content-Length} >= 10240) compress
- compress: if (%{REQ:Referer} == "gphone") compress
- compress: if (%{REQUEST_URI} ~ "/big/") compress
注解
通常情况,我们根据响应头Content-length,判断是否需要压缩,例如:if (%{RESP:Content-Length} >= 10240) compress,这个静态页面,如js,css,html都是没有问题的。但是对php脚本,响应header中没有Content-length这个头,它使用Transfer-Encoding: chunked,这个头表示页面输出用chunked编码。此时要实现压缩,可以通过应用配置,同时在PHP脚本中输出相应头的方式实现。
5、URL重写
语法:
- rewrite: if (CONDITIONs) goto target_url
在rewrite中,CONDITIONs支持多个CONDITION。除HTTP响应header(没办法根据响应 header 做重定向)外都可以出现在rewrite的CONDITION中。
target_url表示重定向的目标url,在target_url可以以$N的形式引用CONDITION中以%{REQUEST_URI}为条件正则匹配到的组, 以%N的形式引用以%{QUERY_STRING}为条件正则匹配到的组。
例子:
# 强制使用https访问
- rewrite: if (%{REQ:X-Forwarded-Proto} != "https") goto "https://%{HTTP_HOST}%{REQUEST_URI}"
# 当 url 匹配 urldir/(.*) ,并且 输入 header referer 等于 sina 时,跳转至页面 /usr/$1,$1 表示刚刚匹配的 urldir/(.*) 中的 (.*) 部分。
- rewrite: if (%{REQUEST_URI} ~ "urldir/(.*)" && %{REQ:REFERER} == "sina") goto "/url/$1"
# 当 url 匹配 urldir/(.*),并且请求的是一个目录时,跳转至 /url/$1
- rewrite: if (-d && %{REQUEST_URI} ~ "urldir/(.*)") goto "/url/$1"
# 当 url 匹配 path,并且请求的不是一个文件时,跳转至 /url/query.php
- rewrite: if (!-f && %{REQUEST_URI} ~ "path") goto "/url/query.php"
# 当查询串等于so,并且 url 以 zhaochou 结尾时,跳转至 /url/%1,%1 表示 query_string 匹配到的部分。
- rewrite: if (%{QUERY_STRING} ~ "^(so)$" && %{REQUEST_URI} ~ "zhaochou$") goto "/url/%1"
# 当查询串不包含sohu,并且 url 以zhaochou结尾时,跳转至/url/query.php?%{QUERY_STRING},%{QUERY_STRING}表示查询串。
- rewrite: if (%{QUERY_STRING} !~ "sohu" && %{REQUEST_URI} ~ "zhaochou$") goto "/url/query.php?%{QUERY_STRING}"
# 如果 url 既不是文件,也不是目录,跳转至 index.php?%{QUERY_STRING}
- rewrite: if (!-d && !-f) goto "/index.php?%{QUERY_STRING}"
警告
如果有形如%{REQUEST_URI} ~ “^(.*)$”类的请求,一定要加上是否是目录或者文件,防止无穷的rewrite。 在goto语句中,虽然某些时候可以不以/开头,但是强烈建议以/开头。
6、指定过期时间和头信息
语法:
- expire: if (CONDITION) time seconds
- mime: if (CONDITION) type content-type
seconds是秒数,content-type是表示文档类型的字符串。
例子:
- expire: if (%{REQ:REFERER} ~ "sina") time 10
# 如果 url 请求文件的扩展名是 pdf2,设置 Content-Type 为 application/pdf
- mime: if (%{REQUEST_URI} ~ ".pdf2$") type "application/pdf"
- mime: if (%{REQUEST_URI} ~ ".pdf2$") type "application/pdf"
# 只要请求 header referer 包含字符串 sina,就设置 Content-Type 为 text/plain
- mime: if (%{REQ:REFERER} ~ "sina") type "text/plain"
if语句支持单个CONDITION。可以出现在CONDITION中的变量参考 Apache Docs ,只支持字符串和正则匹配。