新浪SAE下 riwrite重写规则详解

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

时间: 2024-11-06 09:52:43

新浪SAE下 riwrite重写规则详解的相关文章

新浪sae url rewrite(伪静态、重定向)详解

新浪sae url rewrite(伪静态.重定向)详解 http://www.veryhuo.com phpclubs 2011-11-14 投递稿件 sae全程Sina App Engine,真是一个好东西,他有很多优秀的特性,简单来说SAE就是一个简单高效的分布式Web服务开发.运行平台. 支持现在常用的 php+mysql环境,在开发中难免会碰到项目需要做url rewrite(伪静态),然而sae不支持 apache 下的.htaccess .不过不要难过,sae提供了自己的rewri

新浪SAE环境下使用UEditor

在这个博客中,使用了百度UEditor编辑器,这个编辑器确实不错,开源,而且实现了许多常用的功能.这是官网给出的介绍:UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码... 我 这个博客是放在新浪SAE上的,每次在测试程序的都是现在本地测试,如果成功,就上传到SAE,这次使用Ueditor编辑器也是这样,在本地测试成功 后,就上传到SAE,但在发表博客时,却发现上传图片失败,搜索变了各种方法,

新浪SAE云平台下使用codeigniter的数据库配置

新浪SAE云平台下使用codeigniter的数据库配置 投稿:shichen2014 字体:[增加 减小] 类型:转载 这篇文章主要介绍了新浪SAE云平台下使用codeigniter的数据库配置,主要涉及在database.php的配置,需要的朋友可以参考下 由于新浪SAE对文件权限的限制,cache目录无法修改权限,因此原版Codeigniter无法直接使用.可以尝试codeIgniter 2.10 for SAE:http://code.google.com/p/ci-sae/. 在dat

在新浪SAE上部署PHP项目记录

新浪SAE: http://sae.sina.com.cn 部署步骤: 1.需先注册用户.2.进入用户管理后台--添加应用--填入相关的域名,项目名称,项目描述等. 3.在本地电脑上,命名好与sae上所填的项目名称一致,数据库名称也一致,然后在项目文件的config.php: 'DB_TYPE' => 'mysql', // 数据库类型 'DB_HOST' => 'localhost', // 服务器地址 'DB_NAME' => 'test0527', // 数据库名,需与项目名称一致

【玩转微信公众平台之六】 搭建新浪SAE服务器

赶紧接上一篇继续讲. ------本篇将介绍如何搭建 新浪SAE服务器.猛戳 http://sae.sina.com.cn/1.先自己注册一个账号,如果有新浪的账号,微博之类的都可以直接拿来用,授权一下就可以,如下: 2.接下来会让你填写一些安全设置,自己根据要求如实填写就可以了.要注意的是,你设置的安全密码别忘了,原因如下: 看的懂就好,看不懂也罢,我们继续往下走.3.注册的最后一步是 手机绑定 ,将你手机收到的验证码输入进去即可.这些都没啥难度,我就不多说了.注册成功后,点击 我的首页 回到

Linux下chkconfig命令详解

Linux下chkconfig命令详解 chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法:chkconfig [--add][--del][--list][系统服务] 或 chkconfig [--level <等级代号>][系统服务][on/off/reset] chkconfig在没有参数运行时,显示用法.如果加上服务名,那么就检查这个服务是否在当前运行级启动.如果是,返

微信开发01-申请新浪SAE

为什么开发微信要选择新浪SAE呢,其实新浪SAE有很多的局限性,完全没有自己配置服务器环境来的灵活.那为什么还要用,因为便宜,是的很便宜,虽然现在创建应用不在免费了,每天收取10个豆,1元钱是100豆,也就是说一个月只花3块钱. 但是使用memcache缓存好像是要收费的.使用mysql共享版是免费的. 使用SAE做开发首先需要到SAE上创建一个应用.没有sae的童鞋请戳这里.开通新浪SAE 使用微博登录SAE之会进入到个人主界面.未完成实名认证的请完成实名认证.不然创建的应用在访问时会加上SA

新浪sae上安装原生wordpress4.1

1. 添加/修改wp-config.php文件 <?php /** * WordPress 基础配置文件. * * 本文件包含以下配置选项: MySQL 设置.数据库表名前缀. * 密匙.WordPress 语言设定以及 ABSPATH.如需更多信息,请访问 * {@link http://codex.wordpress.org/Editing_wp-config.php 编辑 * wp-config.php} Codex 页面.MySQL 设置具体信息请咨询您的空间提供商. * * 这个文件用

转载的 Linux下chkconfig命令详解

Linux下chkconfig命令详解 chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法: chkconfig [--add][--del][--list][系统服务] 或 chkconfig [--level <等级代号>][系统服务][on/off/reset] chkconfig 在没有参数运行时,显示用法.如果加上服务名,那么就检查这个服务是否在当前运行级启动.如果是