MENU

三分钟解决VMS的URL重写问题

August 23, 2013 • 程序阅读设置

几个月之前就想去掉vms的url中那难看的入口文件,也曾google多次,无果。前两个月抱着试一试的心态向wdcp中添加了一个规则(事实证明该规则完全可用),但当规则生效之后站点立刻就http 400了,无论如何也无法恢复,只得关闭url rewrite规则。

前天头脑一热想继续整这个事儿,于是本着“碰运气”的目的再次打开了wdcp这坑货,调整url rewrite规则,生效……得,又挂了 无奈撤销规则后,转念一想:apache不是有.htaccess吗?我为何一定要在wdcp这坑货这儿设置呢?心动不如行动,果断添加规则,使其生效。写一个测试页面打印出$_SERVER,一看,还真成功了。规则如下:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>

这时手动访问去掉index.php的url,确实是被web server正常解析的,可是vms的路由完全不认,一切都在错乱……╮(╯▽╰)╭看起来又要改代码了。花了几秒钟快速地找到了rewrite部分CodonRewrite.class.php,看到最终进入路由分析的$URL是这样赋值的:$URL = $_SERVER['REQUEST_URI']; 然而在这之后又有$params = explode('.php/', $URL); 明显看得出来真正需要的内容是在index.php/之后的,但是目前隐藏index.php之后REQUEST_URI就是浏览器地址栏中的内容,并不符合它的要求。为了减少代码修改量,果断打印$_SERVER分析一下,一看,PHP_SELF可以替代REQUEST_URI嘛。果断改成$URL = $_SERVER['PHP_SELF'];,成了。

人嘛,折腾了这个以后,总想着是不是再弄个后缀什么的,url更加好看。由于深受CodonRewrite部分毒害,我一直想着如何用explode()去掉后缀(如.html)。后来头脑中灵光一现,想到一个简单的办法:在它只留index.php/后面部分之后,加上$preg_match = str_replace('.html', '', $params[1]);滤掉.html,啥事儿都没了。

之后为了使Codon Framework自带的url生成功能url方法自动重写,当然是稍作修改。非常简单,这里就不说了。

Archives Tip
QR Code for this page
Tipping QR Code