文档章节

新浪SAE下 riwrite重写规则详解

iceman_os
 iceman_os
发布于 2015/04/02 14:29
字数 1479
阅读 96
收藏 2

AppConfig模块上线,Rewrite和压缩页面功能可以用了

  • 03/19. 2010

AppConfig能做哪些事情?

AppConfig模块负责提供用户自定义web服务器配置的能力,目前可以自行配置的功能包括

  • 目录默认页面

  • 自定义错误页面

  • 压缩

  • 页面重定向

  • 页面过期

  • 设置响应Header的Content-Type

在哪里设置AppConfig选项?

在每个版本的目录下边,有一个叫做config.yaml的文件,只需要在里边追加handel段(绿色部分)即可,AppConfig采用基于yaml的自定义语法.
这里是来自sinat.sinaapp.com的一个例子:

name: sinat version: 1 handle:  - rewrite: if(!is_dir() && !is_file()) goto "index.php?%{QUERY_STRING}" #这里开头有两个空格

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


本文转载自:http://blog.sae.sina.com.cn/archives/93#more-93

iceman_os

iceman_os

粉丝 3
博文 13
码字总数 5453
作品 0
保定
程序员
私信 提问
wuwenbin/bookmark

网址书签 安装步骤 部署代码并配置好web服务器; 创建并导入到数据库; 修改配置数据库连接参数及其他选项; 申请第三方应用并配置; 修改目录为可写权限; url重写配置参考 配置文件修改: ...

wuwenbin
2015/04/09
0
0
新浪SAE搭建WordPress网站固定链接设置url静态化

  最近用新浪的sae给一个同事搭建WordPress博客,于是乎也尝试了一下新浪的这个SAE与计算平台。   注册好SAE后可以在管理平台“推荐应用”中快速安装Wordpress for sae,不过,使用过的朋...

fnnn99
2014/12/12
0
0
php精简高速ip查询免费版3.0--PHP-ip查询

php精简高速ip查询免费版3.0 演示地址:http://tbip.sinaapp.com 1.IP地址查询php版,采用淘宝IP地址库,非常的精准。并且会随着淘宝IP地址库实时更新。所以您获得的数据将会是最新的。 2.此...

xiaogg
2012/04/30
1K
0
美容新闻采集

美容新闻淘客免维护全自动采集 1.采集瑞丽女性美容频道文章,免维护全自动采集 2.可自定义网站标题,关键字,描述等 3.可选择是否应用新浪SAE平台 支持 新浪SAE环境 与普通环境自由切换 4.自定义...

xiaogg
2012/07/02
3.6K
0
谷歌GAE和新浪SAE成功绑定域名并DNS解析方法与教程

谷歌GAE和新浪SAE成功绑定域名并DNS解析方法与教程 免费资源部落 2011年12月03日 22:24 评论» 文章目录 绑定域名到空间的最快最省事的方法就是将你的域名的Name Service更换成为空间了NS,如...

lhanoo
2012/02/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

二、Spring Cloud—Eureka(Greenwich.SR1)

注:本系列文章所用工具及版本如下:开发工具(IDEA 2018.3.5),Spring Boot(2.1.3.RELEASE),Spring Cloud(Greenwich.SR1),Maven(3.6.0),JDK(1.8) Eureka: Eureka是Netflix开发...

倪伟伟
17分钟前
0
0
eclipse常用插件

amaterasUML https://takezoe.github.io/amateras-update-site/ https://github.com/takezoe/amateras-modeler...

大头鬼_yc
28分钟前
0
0
centos7修改命令行或图形界面启动模式

1.systemctl get-default命令获取当前模式 2.systemctl set-default graphical.target 修改启动模式(修改为图形界面,要是修改为命令行就multi-user.target) 2.systemctl set-default multi-...

大圣39
32分钟前
0
0
vue预渲染

prerender-spa-plugin 安装prerender-spa-plugin (插件使用见npm官网)[https://www.npmjs.com/package/prerender-spa-plugin] npm install prerender-spa-plugin --save-dev 配置prerender-s......

莫西摩西
54分钟前
1
0
Command模式

https://www.cnblogs.com/devinzhang/archive/2012/01/06/2315235.html

南桥北木
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部