`
gosin
  • 浏览: 3354 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

新浪SAE如何处理泛域名的问题

SAE 
阅读更多

 

新浪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

   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

    seconds 是秒数, content-type  是表示文档类型的字符串。

    例如:

    - expire: if(in_header["referer"] ~ "sina") time 10

    - mime: if(path ~ "\.pdf2$") type "application/pdf"

   设置响应header Content-Type

    如果 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}" 

 

 设置响应头的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 

 

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云计算入门攻略

    新浪SAE(Sina App Engine)是新浪公司推出的一项云计算服务,它允许开发者在新浪提供的平台上构建和运行基于网络的应用程序。SAE的定位和谷歌的GAE(Google App Engine)类似,都提供了托管服务来简化开发者对于...

    新浪云计算SAE免费空间申请使用及域名.docx

    尽管最初是作为免费试用推出,随后逐步引入收费模式,但最近新浪SAE重新推出了全免费的策略,提供了丰富的免费配额。对于初学者或个人博客用户来说,这些免费资源足够搭建自己的应用。 免费配额包括: 1. 代码空间...

    新浪云计算SAE免费申请使用及域名绑定.docx

    尽管随着时间的推移,SAE开始引入收费模式,但在竞争对手如百度BAE转向完全收费后,新浪SAE重新推出了全面的免费配额计划,以吸引更多用户。 目前,新浪SAE的免费配额相当慷慨,足以满足初学者或个人用户的需求。...

    免费上传个人点至新浪sae空间.pdf

    新浪SAE空间个人网站上传指南 在本资源中,我们将详细介绍如何将个人网站上传到新浪SAE空间中。SAE(Sina App Engine)是新浪微博推出的云计算平台,提供了免费的服务器空间和流量,非常适合个人网站或小型项目。 ...

    新浪SAE、阿里云与盛大云优缺点评测.docx

    【新浪SAE】 新浪SAE(Sina App Engine)是中国新浪公司推出的一款基于云计算的服务,它主要针对开发者,提供应用程序的托管环境。SAE的特点是模仿了Google的GAE,强调开发者的便利性和技术支持。它的优点在于: 1....

    新浪sea云java开发包及工具集成,包括sae-1.1.0-all,svn6个jar包,sae-eclipse

    实现便捷的在本地 eclipse 上开发,在 sae 云服务器上部署和调试,实现在 eclipse 上编译 java web 项目的时候自动生成 war 包,然后再自动通过 svn 上传部署到新浪 sae 云平台的流程,1. 下载 Eclipse 4.2 or 4.3 ...

    新浪SAE搭建PHP项目教程

    新浪SAE(Sina App Engine)是新浪推出的一款基于云计算的PaaS(Platform as a Service)平台,为开发者提供便捷的Web应用部署服务。以下是一个详细的步骤教程,帮助你了解如何在新浪SAE上搭建PHP项目。 1. 注册...

    SAE域名绑定服务申请表.pdf

    【SAE域名绑定服务申请表】是新浪云(Sina App Engine, SAE)为用户提供的一项服务,允许用户将自己的域名绑定到SAE上的应用,从而让应用可以通过自定义的域名对外提供服务,提升用户网站的专业性和易记性。...

    SAE测试web项目(连接SAE数据库)demo

    在本文中,我们将深入探讨SAE(新浪应用引擎)上的Web项目开发,特别是如何连接并操作SAE的数据库。SAE是新浪公司提供的一种基于云计算的PaaS(平台即服务)平台,它为开发者提供了便捷的Web应用程序托管和运行环境...

    phpTxt成绩查询系统通用版v7.5SAE版

    这是SAE专版,新浪SAE免费空间可以直接上传使用,让你的查询可以做到完全免费(免费空间 免费代码 免费新浪三级域名)。 这是个极为简单却非常通用、非常方便的成绩查询系统,通用于几乎所有Excel单二维数据表查询...

    Sina SAE wordpress 3.4.2

    《新浪SAE上的WordPress 3.4.2部署详解》 新浪SAE(Sina App Engine)是新浪云提供的一款基于云计算的服务,它为开发者提供了便捷的Web应用部署平台。WordPress,作为全球最受欢迎的开源博客系统,其3.4.2版本在SAE...

    wordpress4.0 for SAE

    【WordPress 4.0 for SAE】是一款专为新浪云(SAE)平台优化的WordPress版本。这个版本的WordPress已经过调整,以便在新浪云的环境下高效运行,利用SAE的存储服务和计算资源。在使用这个版本之前,我们需要了解一些...

    wordpress for sae

    将WordPress部署到新浪SAE,用户需要按照特定的步骤进行,包括创建SAE应用、上传WordPress文件、配置数据库连接、设置域名和DNS解析等。这个过程简化了传统服务器上的部署流程,让用户能够更加专注于内容创作和网站...

    SaeServer(SAE本地开发环境)v1.1

    因为新浪SAE环境和普通环境的不同,许多SAE提供的服务不能在本地运行。 往往我们写的代码不能在本地测试,每次必须上传到SAE上面进行测试。现在不用 这么麻烦,SaeServer在本地模拟SAE服务。让程序也能在本地进行...

    美容新闻免自动采集淘客源码 v1.0

    可选择是否应用新浪SAE平台 支持 新浪SAE环境 与普通环境自由切换4.自定义推广产品5.自定义广告链接6.自定义文章替换规则方便推广7.自定义是否开启缓存 自定义缓存时间8.url采用base64_decode处理9.本站代码完全开源...

    sina sae app test

    Sina SAE(新浪云应用引擎)是新浪公司提供的一种基于云计算的服务,允许开发者构建、部署和运行Web应用程序。在"Sina SAE App Test for crawling funny content"这个场景中,我们推测这是一个使用Sina SAE平台进行...

Global site tag (gtag.js) - Google Analytics