通过.htaccess隐藏URL中的逗号与ID(基于Zend Framework 1.12)
解决Zend Framework 1.12下URL页面ID隐藏问题
针对你想实现domain.com/subpage-name,15格式URL,并隐藏subpage-name后ID部分的需求,结合Zend Framework 1.12的特性,我整理了一套完整的解决方案:
1. 配置.htaccess重写规则
首先修改项目根目录的.htaccess文件,添加自定义重写规则,把带逗号和ID的URL转发到ZF入口文件,同时保留框架默认的重写逻辑:
RewriteEngine On RewriteBase / # 将 domain.com/subpage-name,15 映射为 index.php?controller=subpage&action=name&id=15 # 请根据你的实际控制器/动作名调整参数映射 RewriteRule ^([a-z-]+),(\d+)$ index.php?controller=$1&action=index&id=$2 [L,QSA] # Zend Framework 默认重写规则(请勿删除) RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] RewriteRule ^.*$ index.php [NC,L]
2. 在Zend Framework中配置自定义路由
接下来需要在框架里配置路由规则,让ZF能正确解析subpage-name,15这种格式的URL,同时生成符合要求的链接。在项目的Bootstrap.php中添加路由初始化方法:
protected function _initRoutes() { $frontController = Zend_Controller_Front::getInstance(); $router = $frontController->getRouter(); // 通用路由:匹配所有 控制器名,ID 的格式 $generalRoute = new Zend_Controller_Router_Route( ':controller,:id', array('action' => 'index'), // 默认动作设为index array('id' => '\d+') // 限制ID为数字类型 ); $router->addRoute('custom-general', $generalRoute); // 如果你有特定的子页面(比如subpage-name对应固定控制器),可以添加专属路由 $specificRoute = new Zend_Controller_Router_Route( 'subpage-name,:id', array( 'controller' => 'subpage', 'action' => 'name' ), array('id' => '\d+') ); $router->addRoute('custom-subpage', $specificRoute); }
3. 生成符合格式的URL
在控制器或视图中生成URL时,指定使用我们定义的自定义路由,就能输出domain.com/subpage-name,15格式的链接了:
// 控制器中生成URL $url = $this->view->url( array('controller' => 'subpage', 'action' => 'name', 'id' => 15), 'custom-subpage' // 指定使用专属路由 ); // 视图脚本中生成URL <?php echo $this->url( array('controller' => 'subpage', 'action' => 'name', 'id' => 15), 'custom-subpage' ); ?>
注意事项
- 确保服务器已启用
mod_rewrite模块,并且Apache配置中对应目录的AllowOverride设置为All,否则.htaccess规则不会生效。 - 如果项目已有其他路由配置,注意调整自定义路由的添加顺序,避免路由匹配冲突。
- 测试时建议清除浏览器缓存或使用隐身窗口,避免旧路由缓存干扰结果。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

