- 浏览: 3255 次
- 性别:
- 来自: 深圳
文章分类
最新评论
新浪SAE 如何处理泛域名的问题
今天看到论坛社区总有人问这个问题,特意整理了一下。
针对 qmei.sinaapp.com以及qlove.sinaapp.com这个例子,如何做到点击链接后,跳转到其他网站。
如图
这样子就可以实现这个功能了。
另附录上 config.yaml文件常见配置
例子:
name: 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() 分别是其否定形式。
表达式语法用于以下功能:
- compress: if (single_express) compress
在 compress 中 single_express 表示单一的表达式,不能用 && 做复合, in_header , out_header , path 都可以出现在 single_express 中
例如:
- compress: if(out_header["Content-Length"] >= 10240) compress
- compress: if(in_header["Referer"] == "gphone") compress
- compress: if(path ~ "/big/") compress
- 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
seconds 是秒数, content-type 是表示文档类型的字符串。
例如:
- expire: if(in_header["referer"] ~ "sina") time 10
- mime: if(path ~ "\.pdf2$") type "application/pdf"
如果 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"
在 expire 和 mime 中 single_express 表示单一的表达式,不能用 && 复合, in_header , path 都可以出现在 single_express 中,并且 op 只能是 ~ 或者 == ,即只支持正则匹配和字符串比较。
禁止127.0.0.1 访问 private 目录
- hostaccess: if(path ~ "/private/") deny "127.0.0.1"
只允许127.0.0.1 访问 .conf 结尾的文件
- hostaccess: if(path ~ "\.conf$") allow "127.0.0.1"
禁止127.0.0.1 的所有访问(这个要慎用)
- hostaccess: deny "127.0.0.1"
对 cron 任务保护,防止被外部抓取,我们将 cron 任务放在 cron 目录下(sae 中 cron 服务执行时,走的是内部网络)
- hostaccess: if(path ~ "/cron/") allow "10.0.0.0/8" 允许 10 打头的所有 IP
对于屏蔽一组IP 地址,可以写成子网掩码形式,或者将多个 IP 之间加以空格。子网掩码形式如下:
- hostaccess: if(path ~ "/cron/") deny "108.192.8.0/24" 屏蔽 108.192.8 打头的所有 IP
多个IP 形式如下:
- hostaccess: allow "108.134.13.24 108.122.122.13" 允许 108.134.13.24 和 108.122.122.13 这两个 IP
或:
- hostaccess: allow "108.134.13.24","108.122.122.13"
(ip地址需要加引号, all 代表所有 IP 地址,具体可以参考 Apache配置 . allow 是白名单方式, deny 是黑名单)
访问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"
在 hostaccess 和 passwdaccess 中 single_express 表示单一的表达式,不能用 && 复合, in_header , path 都可以出现在 single_express 中,并且 op 只能是 ~ 或者 == ,即只支持正则匹配和字符串比较,并且 if 语句可以省略,表示无条件执行访问控制
更多例子:
目录默认页面
当访问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
压缩
当页面内容大于 10K 字节时压缩
- compress: if(out_header["Content-Length"] >= 10240) 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 是题中之意。
压缩配置注意事项
通常情况,我们根据响应头Content-length ,判断是否需要压缩,例如: if(out_header["Content-Length"]>=10240) compress, 这个静态页面,如 js,css,html 都是没有问题的。
但是对php 脚本,响应 header 中,没有 Content-length 这个头,它使用 Transfer-Encoding: chunked ,这个头表示页面输出用 chunked 编码。此时要实现压缩,可以通过配置 appconfig ,同时在php 脚本中输出相应头的方式实现。
例如在 appconfig 中写 if(out_header["Use-Compress"] == "1") compress ,在需要压缩的 php 脚本中写
压缩生效检查
检查是不是输出了响应头:Content-Encoding: gzip 。
IE下的 HttpWatch 和 FireFox 下的 Firebug 都可以查看页面的响应 header 。
当 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}"
如果 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
【FAQ 】 :
1. 如果有形如 path ~ "^(.*)$" 类的请求,一定要加上 is_file 或 is_dir 之类的判断,防止无穷的 rewrite 。
2. path 是用户请求的资源路径,比如请求 http://qlove.sinaapp.com/b/index.php?a=4 ,那么 path 就是 /b/index.php 。
3. 在 goto 语句中,虽然某些时候可以不以 / 开头,但是强烈建议以 / 开头。
生效检查
检查是不是输出了响应头:Cache-Control 。 IE 下的 HttpWatch 和 FireFox 下的 Firebug 都可以查看页面的响应 header 。
相关推荐
新浪云计算SAE免费空间申请使用及域名.docx
新浪云计算SAE免费申请使用及域名绑定.docx
实现便捷的在本地 eclipse 上开发,在 sae 云服务器上部署和调试,实现在 eclipse 上编译 java web 项目的时候自动生成 war 包,然后再自动通过 svn 上传部署到新浪 sae 云平台的流程,1. 下载 Eclipse 4.2 or 4.3 ...
这是SAE专版,新浪SAE免费空间可以直接上传使用,让你的查询可以做到完全免费(免费空间 免费代码 免费新浪三级域名)。 这是个极为简单却非常通用、非常方便的成绩查询系统,通用于几乎所有Excel单二维数据表查询...
因为新浪SAE环境和普通环境的不同,许多SAE提供的服务不能在本地运行。 往往我们写的代码不能在本地测试,每次必须上传到SAE上面进行测试。现在不用 这么麻烦,SaeServer在本地模拟SAE服务。让程序也能在本地进行...
基于新浪SAE的微信后台,转发到本地并弹幕显示 代码包括三部分 server 这一部分代码运行在新浪的SAE服务器上。部署方法如下: 在SAE上创建一个新应用, 再将server文件夹中的三个文件拷贝到原程服务器上即可。 注意...
可选择是否应用新浪SAE平台 支持 新浪SAE环境 与普通环境自由切换4.自定义推广产品5.自定义广告链接6.自定义文章替换规则方便推广7.自定义是否开启缓存 自定义缓存时间8.url采用base64_decode处理9.本站代码完全开源...
如果你用过谷歌的GAE、新浪的SAE免费空间的话,那么肯定知道反向绑定域名是多么得有用了,它可以让你将自己的域名绑定到任意空间上,即使这个空间不支持绑定域名,有点强制的味道。 使用网站反向绑定域名还有一个...
新浪SAE云安装说明: 安装MiinCMP前,请确认你已激活Mysql数据库。 有关在SAE上的详细安装 信息见, juuluu 在Java应用中使用SAE提供的MySQL服务很简单,你就像使用普通的MySQL一样即可,当然你需要开启MySQL...
7、本程序不限制域名,单用户版本,支持sae、bae、虚拟主机等。 8、完全开源,无加密代码。 9、安装请参考压缩包内视频教程,新版本也有文档版本的安装方法。 淘宝应用:http://open.taobao.com/index.htm
SAE云专版可以安装在新浪SAE云平台上,是Z-Blog团队专为SAE量身打造的Z-BlogPHP系统。 Z-BlogPHP是Z-Blog团队根据国内独立博客用户需求而全新开发的一款博客系统,作为领先的博客系统提供者,我们希望提供完善的...
本程序为了考虑一些卖虚拟商品的卖家不会建站而又想拥有...配置个人的新浪免费空间3、上传程序4、修改个人信息5、配置淘宝授权6、系统的设置和使用7、本程序不限制域名,单用户版本,支持sae、bae、虚拟主机等。8、完
这是SAE专版(linux版),新浪SAE空间可以直接上传使用让你的查询可以做到完全(空间+代码+新浪三级域名)。 这是个极为简单却非常通用、非常方便的成绩查询系
源码可以使用sae,bae,部分虚拟主机不可用哦,建议新浪使用sae; 1、如何申请新浪免费空间 2.配置个人的新浪免费空间 3、上传程序 4、修改个人信息 5、配置淘宝授权 6、系统的设置和使用 7、本程序不限制...
一、购买新浪云SAE 为什么选择SAE? 免费二级域名和支持https访问,不用备案,可用于做微信小程序服务器。 SAE推荐链接:http://sae.sina.com.cn/ 选择对应的部署环境 自定义 -> 开发言语:自定义 -> 运行环境:云...
此源码为STM32f103vet6芯片与ESP8266 WiFi模块的驱动源码,可以连接外网,示例中的为连接新浪的域名和数据库实现通过微信经过外网控制led灯的程序,还有一个新浪sae端的php程序
1,准备工作:注册微信公众平台测试号,注册新浪sae并在上面建一个应用,熟悉python的webpy框架 2,应用与微信进行绑定:登录微信平台,填写应用的url及token项,若填写的URL正确响应微信发送的Token验证,则绑定完成...
新浪SAE免费php空间申请地址:http://sae.sina.com.cn/activity/invite/101149/weibo 新浪SAE免费php空间注册功略:http://hbwanghai.blog.163.com/blog/static/199297147201222310226519/ 优点 1.不用购买独立空间/...
在新浪云中创建一个Storage服务的域名,安全权限全部取消(DEMO中并没有编写access key加密),修改源代码upload.php中的SAE部分即可。 特色功能 MySQL存储的密码采用SHA-256散列配Base64压缩加密,用户敏感操作时会...