[求教]sae上rewrite的疑问

#1 huangyang0924

如果要把aaaaa.sinaapp.com/xxxxx.flv rewrite到 aaaaa.sinaapp.com/index.php?c=main&a=flv&id=xxxxx要怎么写rewrite规则?其中xxxxx只能是数字
先谢谢jake大大
貌似我这样写不行
handle:
  - rewrite: if(path ~ "^\d+") goto "index.php?c=main&a=flv&id=$1"



规则能匹配但id传不过去

2010-12-24 08:10:25

#2 jake

单独的服务器端映射规则我也不知道怎么做(speedphp用的是PHP端的匹配),可以参考SAE的文档:
http://wiki.sae.sina.com.cn/doku ... 5%E6%89%8B%E5%86%8C

如果是speedphp框架本身的urlrewrite,就很简单。只要加入handle:
  - rewrite: if(!is_dir() && !is_file()) goto "index.php?%{QUERY_STRING}"

和加入speedphp本身的urlrewrite配置即可:
详细请看:
http://speedphp.com/bbs/redirect.php?goto=findpost&ptid=1155&pid=6249

2010-12-24 09:03:47

#3 huangyang0924

谢谢,先学习学习

2010-12-24 09:58:06

#4 huangyang0924

jake大大我已经可以实现urlrewrite了不过还有问题
我这样设置的
        'launch' => array( // 加入挂靠点,以便开始使用Url_ReWrite的功能
                'router_prefilter' => array(
                        array('spUrlRewrite', 'setReWrite'),  // 对路由进行挂靠,处理转向地址
                ),
                'function_url' => array(
                        array("spUrlRewrite", "getReWrite"),  // 对spUrl进行挂靠,让spUrl可以进行Url_ReWrite地址的生成
                ),
        ),
       
        'ext' => array(
                'spUrlRewrite' => array(
                        'suffix' => '.flv',
                        'sep' => '/',
                        'map' => array(
                                'sina' => 'sina@get'
                        ),
                        'args' => array(
                                'sina' => array('id'),
                        ),
                ),
        ),
这个是我的rewrite设置
现在能将xxx.com/sina/aaaaaaaa.flv正确映射到xxx.com/index.php?c=sina&a=get&id=aaaaaaaa
但其他控制器的动作也会被映射
如何做到只映射sina控制器?
谢谢了{:3_46:}

2010-12-25 18:07:14

#5 huangyang0924

jake大大我已经可以实现urlrewrite了不过还有问题
我这样设置的
        'launch' => array( // 加入挂靠点,以便开始使用Url_ReWrite的功能
                'router_prefilter' => array(
                        array('spUrlRewrite', 'setReWrite'),  // 对路由进行挂靠,处理转向地址
                ),
                'function_url' => array(
                        array("spUrlRewrite", "getReWrite"),  // 对spUrl进行挂靠,让spUrl可以进行Url_ReWrite地址的生成
                ),
        ),
       
        'ext' => array(
                'spUrlRewrite' => array(
                        'suffix' => '.flv',
                        'sep' => '/',
                        'map' => array(
                                'sina' => 'sina@get'
                        ),
                        'args' => array(
                                'sina' => array('id'),
                        ),
                ),
        ),
这个是我的rewrite设置
现在能将xxx.com/sina/aaaaaaaa.flv正确映射到xxx.com/index.php?c=sina&a=get&id=aaaaaaaa
但其他控制器的动作也会被映射
如何做到只映射sina控制器?
谢谢了{:3_46:}

2010-12-25 18:07:31

#6 huangyang0924

jake大大我已经可以实现urlrewrite了不过还有问题
我这样设置的
'launch' => array( // 加入挂靠点,以便开始使用Url_ReWrite的功能
        'router_prefilter' => array(
                array('spUrlRewrite', 'setReWrite'),  // 对路由进行挂靠,处理转向地址
        ),
        'function_url' => array(
                array("spUrlRewrite", "getReWrite"),  // 对spUrl进行挂靠,让spUrl可以进行Url_ReWrite地址的生成
        ),
),

'ext' => array(
        'spUrlRewrite' => array(
                'suffix' => '.flv',
                'sep' => '/',
                'map' => array(
                        'sina' => 'sina@get'
                ),
                'args' => array(
                        'sina' => array('id'),
                ),
        ),
),
这个是我的rewrite设置
现在能将xxx.com/sina/aaaaaaaa.flv正确映射到xxx.com/index.php?c=sina&a=get&id=aaaaaaaa
但其他控制器的动作也会被映射
如何做到只映射sina控制器?
或者说如何防止smarty的 {spRrl c=user a=login}变成/user/login.flv
谢谢了{:3_46:}

2010-12-25 18:08:34

#7 jake

如果只是这个URL要做映射,那么可以不用urlrewrite扩展,直接在入口文件做一下url判断就行了。

2010-12-25 19:10:17

#8 huangyang0924

我还有个想法就是修改smarty的{spUrl}功能,请问在哪个文件里修改?我在driver/smarty里找好久没找到- -

2010-12-26 14:46:15

#9 jake

我还有个想法就是修改smarty的{spUrl}功能,请问在哪个文件里修改?我在driver/smarty里找好久没找到- - ...
huangyang0924 发表于 2010-12-26 14:46
在smarty中使用的spUrl函数是通过spAddViewFunctions来注册的函数,函数体在spFunction.php文件内,属于sp的核心函数之一。
不过这里建议无需修改speedphp框架的内部文件——这也是使用框架的一个规则。

对于spUrl,可以通过扩展点来修改其作用。在先自行写一个spUrl类似的函数(比如说spUrl2),然后在程序配置内加入
'launch' => array(
  
'function_url' => array('spUrl2'),
),

那么在框架中调用的spUrl函数,都会执行spUrl2了。

2010-12-26 17:25:46

#10 huangyang0924

恩谢谢jake大大
我好好研究一下

2010-12-26 22:05:18

#11 huangyang0924

将spFunctions.php中的
//if( $launch = spLaunch("function_url", array('controller'=>$controller, 'action'=>$action, 'args'=>$args, 'anchor'=>$anchor, 'no_sphtml'=>$no_sphtml), TRUE ))return $launch;//2010/12/26日修改
注释掉
可屏蔽Smarty中spUrl的自动UrlRewrite功能
就像jake大大说的,不建议大家修改框架
此处仅限于本人实现特殊功能需求
仅供参考目前为止没发现有什么不良反应
但不表示会存在不良反应- -
有待进一步测试

2010-12-26 22:37:51

#12 jake

将spFunctions.php中的注释掉
可屏蔽Smarty中spUrl的自动UrlRewrite功能
就像jake大大说的,不建议大家修改 ...
huangyang0924 发表于 2010-12-26 22:37
其实你注释的地方,正是扩展点,也就是你自己加上去的urlrewrite的地方。
               'function_url' => array(                        array("spUrlRewrite", "getReWrite"),  // 对spUrl进行挂靠,让spUrl可以进行Url_ReWrite地址的生成                ),

所以你直接删除上面的配置,就可以取消这段代码的作用。sp的设计本来就可以让开发者自行在配置里面修改这些的,所以何必要直接改代码呢?修改框架代码其实没有什么副作用,因为那是开发者个人的事情,只不过如果在团队开发中可能会出现下面几个问题:1. 团队成员理解困难,因为有些东西是个人修改了,其他人并不清楚。
2. 框架类库升级有问题,一般来说,最好的第三方类库升级就是直接覆盖代码即可,所以类似speedphp或是smarty等类库都努力做到向下兼容。

所以,一般而言,最好是先按第三方类库的规则来进行改动,如果发现规则真的无法达到需要的结果,可以和作者联系之类的方法来解决——像新的smarty我也和他们作者联系过,修改了几个地方。最后才是直接修改第三方代码,不过我们团队就算是修改了代码,也会全部人通报并且记录的。

——以上这里只是顺便说一下为什么我一直说不建议大家修改框架代码的原因,做个记录,好写到手册里面,呵呵。;P

2010-12-27 07:44:34

#13 huangyang0924

其实你注释的地方,正是扩展点,也就是你自己加上去的urlrewrite的地方。
所以你直接删除上面的配置,就 ...
jake 发表于 2010-12-27 07:44
这个样子 - -|||   原来就是配置文件里面自己加进来的- -||汗。。没仔细看注释。。实在是失败
   恩谢谢jake指教,刚接触框架这东西还有好多不懂,还要多多指教啦

2010-12-30 13:57:14