云计算开发者社区

用新浪微博连接

一步搞定

查看: 46399|回复: 64

说明一下URL rewrite是如何工作的 方便大家写rewrite   [复制链接]

Rank: 9Rank: 9Rank: 9

发表于 2012-3-26 16:53:18 |显示全部楼层
本帖最后由 文峰 于 2012-3-26 18:27 编辑

背景知识
1.rewrite出错后 最常见的报错是404和死循环,出现死循环会显示下面的报错  
Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, saesupport@sina.cn and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.


2.rewrite可以通过面板设置 也可以通过修改config.yaml配置  本文主要给出的代码规则 面板可以根据本文自行设置
3.rewrite的文档有两块 :
http://sae.sina.com.cn/?m=devcenter&catId=193#anchor_4bc6c66b7146416bbb4e492d30b0e02e
http://sae.sina.com.cn/?m=devcenter&catId=193#anchor_43a8375a9c73039a947ead37bfef5be1


工作方式
    rewrite就是将 访客请求的URL 改写成服务器可以正确执行的标准URL。一般用来实现伪静态,如:将 aaa.com/xxx/yyy 改写成 aaa.com/index.php?i=xxx&j=yyy

    SAE的rewrite简化了传统htaccess的rewrite写法,通过类自然语言的判断就可以实现rewrite规则的生成。但是由于大家对他的工作方式不是很了解,容易形成死循环 出现背景知识1中的报错。

    那么rewrite是如何工作的呢?




如图所示
rewrite会从上到下依次匹配各条规则 如果有一条规则匹配 就执行该规则 并将生成的URI重复这个过程 直到一个URI不匹配任何规则  服务器就会执行这个URI.


附件: 你需要登录才可以下载或查看附件。没有帐号?立即注册

使用道具 举报

Rank: 9Rank: 9Rank: 9

发表于 2012-3-26 16:59:28 |显示全部楼层

常见rewrite 规则

请注意千万不要弄反 rewrite是将浏览器的url改写成最终执行的URL

1.伪静态传参:    例如 将用户的访问的 aaa/bbb/ccc.html 路径 改写成 index.php?x=aaa&y=bbb&z=ccc
  1. - rewrite: if ( !is_file() && !is_dir() && path~"(.*)/(.*)/(.*)\.html" ) goto "index.php?x=$1&y=$2&z=$3"
复制代码
2.将子文件夹设置为入口文件夹:   例如 将所有的请求全部rewrite到webroot/文件夹下 不允许访问webroot/文件夹外的文件
  1. - rewrite:if ( path ~ "^(?!webroot/)(.*)" ) goto "webroot/$1?%{QUERY_STRING}"
复制代码

3.为子文件夹绑定一个域名: 例如 为子文件夹domain/绑定域名www.b.com
  1. - rewrite:if (  in_header["host"] ~ "www.b.com" && path ~ "^(?!domain/)(.*)" ) goto "domain/$1?%{QUERY_STRING}"
复制代码
4域名转跳: 例如 将a.com转跳到www.a.com
  1. - rewrite:if (  in_header["host"] ~"^a.com"   && path ~ "(.*)" ) goto "http://www.a.com/$1?%{QUERY_STRING}"
复制代码





使用道具 举报

Rank: 9Rank: 9Rank: 9

发表于 2012-3-26 17:00:30 |显示全部楼层

非官方的rewrite规则

由于rewrite模块的变动比较少 所以下面的规则虽然没有官方的支持 但也可以用
1.301转跳
  例如 如果a.com访问则301转跳到www.a.com应该使用以下规则
  1. - rewrite: if(in_header["host"] ~ "^a.com" && path ~ "^(.*)") goto "http://www.a.com/$1?%{QUERY_STRING} [R=301]"
复制代码

注意 [R=301]前有空格

使用道具 举报

Rank: 11Rank: 11Rank: 11Rank: 11

发表于 2012-3-26 17:02:23 |显示全部楼层
这个图简单易懂啊!

使用道具 举报

Rank: 7Rank: 7Rank: 7

发表于 2012-3-26 18:35:17 |显示全部楼层
先顶一顶再看...
欢迎大家粉我http://weibo.com/young40
我仅仅是个SAE的爱好者, 不是SAE官方人员. 不过写得了代码, 杀得了木马,调得了异常,欢迎各种交流...如果你是妹纸, 我还可以请吃饭.

使用道具 举报

Rank: 2

发表于 2012-3-26 20:02:33 |显示全部楼层
文峰 发表于 2012-3-26 17:00
占位 常见案例

http://cloudbbs.org/forum.php?mod=viewthread&tid=708

这个是我需要的插件
不知道能否安装上
非常感谢!!

使用道具 举报

Rank: 12Rank: 12Rank: 12

发表于 2012-3-26 20:32:03 |显示全部楼层
path ~".*" 报错的原因明白了,原来是死循环

使用道具 举报

Rank: 9Rank: 9Rank: 9

发表于 2012-4-9 18:21:05 |显示全部楼层
补上常见的例子了  

使用道具 举报

Rank: 5Rank: 5

发表于 2012-4-9 22:03:58 |显示全部楼层
浅显易懂!

使用道具 举报

Rank: 6Rank: 6

发表于 2012-4-12 09:27:13 |显示全部楼层
收藏了。。。。。。。。。。

使用道具 举报

Rank: 16Rank: 16Rank: 16Rank: 16

发表于 2012-4-13 09:59:02 |显示全部楼层
多谢啊,,又多了知道的东西~~

使用道具 举报

Rank: 9Rank: 9Rank: 9

发表于 2012-4-15 04:50:55 |显示全部楼层

RE: 说明一下URL rewrite是如何工作的 方便大家写rewrite

文峰 发表于 2012-3-26 17:00
以下情况应该在PHP页中进行处理 不应该使用rewrite:
1.泛域名 根据域名读取指定用户的数据

标记~~~~

使用道具 举报

Rank: 1

发表于 2012-4-23 11:41:23 |显示全部楼层
文峰 发表于 2012-3-26 16:59
1.伪静态传参:    例如 将用户的访问的 aaa/bbb/ccc.html 路径 改写成 index.php?x=aaa&y=bbb&z=ccc2.将子 ...

试了一下,不行哦:
我打算使用:appname.sinaaapp.com/xxx/yyy
来访问:appname.sinaaapp.com/index.php?c=xxx&a=yyy  (SpeedPHP框架)

配置如下:
  1. handle:
  2. - rewrite: if ( !is_file() && !is_dir() && path~"(.*)/(.*)" ) goto "index.php?c=$1&a=$2"
复制代码
结果报错了

使用道具 举报

Rank: 9Rank: 9Rank: 9

发表于 2012-4-23 12:13:12 |显示全部楼层
Im奥特曼 发表于 2012-4-23 11:41
试了一下,不行哦:
我打算使用:appname.sinaaapp.com/xxx/yyy
来访问:appname.sinaaapp.com/index.php?c=x ...

报什么错?

使用道具 举报

Rank: 1

发表于 2012-4-23 12:42:46 |显示全部楼层
文峰 发表于 2012-4-23 12:13
报什么错?

我用的是SpeedPHP框架 报的是这个框架的错误

我想请教下:
上面的规则没有问题的吧

使用道具 举报

Rank: 9Rank: 9Rank: 9

发表于 2012-4-23 13:26:52 |显示全部楼层
没问题的

使用道具 举报

Rank: 1

发表于 2012-4-26 10:35:45 |显示全部楼层
相当不错呀 哈哈哈

使用道具 举报

Rank: 3Rank: 3

发表于 2012-5-5 00:13:00 |显示全部楼层
学习了,值得收藏

使用道具 举报

Rank: 5Rank: 5

发表于 2012-5-7 13:25:34 |显示全部楼层
不错,支持一下峰哥的贴子.

使用道具 举报

Rank: 9Rank: 9Rank: 9

发表于 2012-5-7 21:04:46 |显示全部楼层
第四条可以简写为:
  1. - rewrite: if(in_header["host"] ~ "^a.com" && path ~ "^(.*)$") goto "http://www.a.com/$1 [L,QSA,R=301]"
复制代码

点评

解品喜  这个代码 最关键的301 部分 [L,QSA,R=301] 前面 要有一个空格,如果没有空格会报错的...  发表于 2012-7-8 22:17:07

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

Archiver|云计算开发者社区 ( 京ICP证000007-137 )

GMT+8, 2018-7-21 19:51 , Processed in 0.221569 second(s), Total 14, Slave 13 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部