YII urlManager以及301 nginx注意事项

来源:互联网 发布:c盘中的windows大小 编辑:程序博客网 时间:2024/06/05 06:44

前不久,群里面还一直在说这个事情,本着简单的原则一概而过,不巧今天一个需求搞到下午3点才解决!看来简单的东西,过久了没去玩还是会出问题的!

先来说说urlManager的转向吧!

在YII配置main.php中的urlManager   大家会发现rules中一般都会存在

'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',这是YII中入口的规则,控制器然后方法名,以site控制器为例:

'<action:\w+>'=>'site/<action>',大家一般在添加一个默认访问控制器,可以实现让访问去一层,

然后呢,我们会接到各种个性化的转向,比如

http://host/detail.html?proid=279384  => http://host/product/27938.html?

实现起来很简单

'product/<proid:.+>'=>'site/detail',同样一个更简单的转向

http://host/product.html?scateid=14530  => http://host/14530.html?

按刚才所指'<scateid:.+>'=>'site/product',这时候细心的coder会发现,问题出现了,因为我们用的是全匹配.+,也就是会匹配前面的site/detail的定义,这很简单,移动到后面就很好的解决了,如果还觉得不妥,我们可以对后面的ID进行识别,至少ID不会出现‘/’,把正则改一改也完美实现,正当我觉得so easy的时候,点点页面发现,整个路径全部错乱了!再去找了一下原因,原来<scateid:.+>'=>'site/product',与我们最开始写的'<action:\w+>'=>'site/<action>',发生了冲突,而且这时候我们可不能以排序的方式解决问题,这是一个并行的,那么肯定只能去修正正则的匹配问题,经过各种的匹配以及验证,最后我妥协了,当scateid  可能为权英文类似方法名?最后还是协调需求,在scateid前面加上product/<proid:.+>  类似的前缀,建议做转化的时候不要直接处理,最好做一个标识,当然如果ID规则点也是完全没有压力实现的,只是建议!

也许我们会做到比如2级域名的那些转向处理,其实很简单了

'http://<domain:.+>.host/product/<proid:.+>'=>'site/detail',

提到这里不得不回顾一下301,前面的文章书写过nginx中,当碰到带参数的跳转时候,需要提取$args属性,其实这也可以更简洁的查看结构!不过在使用YII框架的时候,大家会发现->

if (!-e $request_filename) {
        rewrite (.*) /index.php last;
    }

我一直没有注意这一段,写在最后面也没注意...

今天为了做老连接的跳转方便SEO的抓取,我马上写出了下面的代码

if ($request_uri ~* "^/detail\.html\?proid=([a-z0-9\-]{1,36})$"){
        set $cate $1;
        set $args '';
        rewrite ^/.*$ http://$host/product/$cate.html permanent;
    }

信息满满的去刷新页面看看效果,然后各种疑问,实在没有哪里有任何错误,就是不执行!找完所有可能的错误点,实在是完败,找了大神同事过来指点,马上明白了

问题出在了

if (!-e $request_filename) {
        rewrite (.*) /index.php last;
    }这里,

我以前一直觉得这段的含义是文件或目录不存在时,重定向到某个php文件上,然而我们忽略了  rewrite (.*) /index.php last;这里面,rewrite得到url后的get变量,然后进行组装类似与&,然后传入YII,再来到了urlmanager的规则面前,也就是在这里就是断点了,匹配的终点,所以在其之后的所有规则理所当然的无效!同理,如果你去掉了这一段,你所有的转向连接估计也找不到实体文件或者目录,直接404!

都是几个很简单的东西,只是今天卡在这里啰嗦一点,以后出现类似问题也不至于再卡这了!

 


原创粉丝点击