zoukankan      html  css  js  c++  java
  • 新浪SAE URLRewrite(伪静态、重定向)详解

    SAE全称Sina App Engine,真是一个好东西,他有很多优秀的特性,简单来说SAE就是一个简单高效的分布式Web服务开发、运行平台。支持现在常用的 PHP+Mysql 环境,在开发中难免会碰到项目需要做 URL Rewrite(伪静态、跳转等),然而SAE不支持 Apache 下的 .htaccess,不过不要难过,SAE提供了自己的 Rewrite 方式,本文我们就对SAE的 Rewrite 做个介绍,希望需要的同学能快速根据自己需求写想要的规则。

    config.yaml 简介

    SAE的配置文件在每个应用的根目录里面,名字是config.yaml。这个文件就类似于 Apache 的 .htaccess,所有的伪静态规则,404设置等都在这里配置。

    config.yaml内容格式

    name: phpclubs
    version: 1
    handle:
    - directoryindex: index.php index.html index.htm
    - errordoc: 404 /path/404.html
    - rewrite: if(!is_dir( ) && path ~ "urldir/(.*)") goto "/tools/$1"

    上面是一个应用里面的 config.yaml 文件

    第一行 表示 当前应用的名字
    第二行 表示 当前应用的代码的版本
    第三行 handle 下面的就是我要写的规则

    config.yaml修改途径

    我们创建项目版本时系统会自动生成config.yaml文件在根目录(如果没有自己可以手动创建一个),第一种 我们可以通过 在线编辑器(SAE CLOUD EDITOR) 进行编辑config.yaml文件;第二种 我们还可以使用svn本地编辑,提交到服务器,修改都是实时生效的。建议使用第二种方法,不容易出错,方便快捷。

    语法说明

    AppConfig 的语法分两种,一种是简单的参数罗列方式,一种是灵活的表达式语法,不同的功能会用到不同的类型的语法。

    1、表达式语法

    其形式为:

    if (表达式) 执行规则

    表达式 有如下形式:

    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()

    关于以上形式说明如下:

    in_header 是请求头,out_header 是响应头,header_name 是 header 的名字,这个我们一般用到的不多;

    op 是操作符,有 ~(正则匹配) !~(正则不匹配) ==(相等,用于字符串和数字) !=(不相等,用于字符串和数字) >, >=, <, <=(比较操作符仅用于整形数字),其中~正则匹配,用的比较多;

    string 是形如 “xxxx” 的字符串;

    string_or_digit 表示 string 或者 digit,根据 op 的种类,后面跟 string 或者 digit;

    path 是系统宏,表示用户请求的 url 去掉主机部分和查询串后剩下的部分,用到的很多,例如:http://www.xxx.com/list/test.php?id=23 path就是 /list/test.php

    query_string 是系统宏,表示查询串,一般是url中问号后面的内容 例如上面 的url 中的 id=23

    is_file() 和 is_dir 是系统函数,判断 path 是文件还是目录,!is_file(),!is_dir() 分别是其否定形式(使用也比较多)。

    2、URL重写

    - rewrite: if (表达式) goto target_url

    在 Rewrite 中,表达式可以用 && 连接,组成复合表达式。 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}"

    比如我们要先下面的伪静态:

    实例1

    真实处理地址为:www.xxx.com/index.php?a=list&b=new&id=23

    要伪静态成这样:www.xxx.com/list-new-23.html

    规则:

    - rewrite: if(path ~ "list-new-(d+).html") goto "index.php?a=list&b=new&id=$1"

    实例2

    真实处理地址为:www.xxx.com/index.php?a=list&b=new&id=23

    要伪静态成这样:www.xxx.com/list-new.php?id=23

    规则:

    -rewrite: if(path ~ "list-new.php" && query_string ~ "id=(d+)") goto "index.php?a=list&b=new&id=%1"

    3、自定义目录默认页面

    当访问 URL 没有指定文件的路径时,返回aaa.php,如果其不存在,则返回bbb.html

    – directoryindex: aaa.php bbb.html

    4、自定义错误页面(404页面等)

    遇到 404 错误,返回 /path/404.html 文件
    遇到 403 错误,返回 /path/403.html 文件

    – errordoc: 404 /path/404.html
    – errordoc: 403 /path/403.html

    5、对文件目录进行简单的访问权限认证

    访问 secret 目录需要密码,允许用户 test 用密码 123qwe 访问,用户 coder 用密码 123asd 访问:

    – passwdaccess: if(path ~ "/secret/") passwd "test:123qwe coder:123asd"

    访问 .text 结尾的文件需要密码,允许用户 writer 用密码123zxc:

    – passwdaccess: if(path ~ :.text$:) passwd "writer:123zxc"

    所有访问都要密码,允许用户 writer 用密码 123zxc 访问:

    – passwdaccess: passwd "write:123zxc"

    用户的网站后台程序都放在 admin 目录下,需要对admin目录做密码保护:

    – passwdaccess: if(path ~ "/admin/") passwd "admin:admin123"

    尾语

    相信你试完上面的东西,应该可以自己写想要的规则了,祝你好运!

  • 相关阅读:
    shell管道和重定向
    shell脚本
    Hexo学习笔记--常用命令及部署步骤
    Git学习笔记--Git常用命令
    Spark link集合
    Struts2学习笔记--Struts2的体系结构
    JNI错误记录--JNI程序调用本地库时JVM崩溃
    Hibernate学习笔记--使用ThreadLocal
    Hibernate学习笔记--核心编程
    Hibernate学习笔记--映射配置文件详解
  • 原文地址:https://www.cnblogs.com/kimshen/p/6120605.html
Copyright © 2011-2022 走看看