PHP博客路由系统如何实现动态page_slug匹配无需硬编码
PHP动态博客路由实现方案
你当前的.htaccess配置已经正确,无需修改——它已经把所有不存在对应文件的请求统一转发到入口文件index.php,只需要调整路由匹配逻辑,替换硬编码的单条博客规则,就能实现自动识别动态slug。
替换原有路由代码
把原来的switch路由块替换为以下代码,核心是用正则匹配捕获路径中的动态参数:
// 预处理请求路径:去除查询参数、首尾多余斜杠 $requestPath = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/'); switch ($requestPath) { case '': require __DIR__ . '/views/index.php'; break; default: // 匹配/blog/开头的动态文章路径 if (preg_match('#^blog/([a-zA-Z0-9\-_]+)$#', $requestPath, $pathMatch)) { // 自动提取路径中的slug赋值给GET参数 $_GET['page_slug'] = $pathMatch[1]; require __DIR__ . '/views/blog/page.php'; break; } // 所有规则都未匹配时返回404状态 http_response_code(404); require __DIR__ . '/views/404.php'; break; }
规则说明
- 正则规则
#^blog/([a-zA-Z0-9\-_]+)$#会自动匹配所有/blog/xxx格式的路径,捕获组里的内容就是动态的page_slug - 规则默认允许slug包含大小写字母、数字、横杠、下划线,覆盖绝大多数博客文章别名的命名场景,如果需要支持其他字符可以自行调整正则的字符范围
- 原来硬编码的
/blog/blog-post-one路由可以直接删除,所有博客文章路径都会自动走这套匹配逻辑,不需要逐篇加规则 - 新增了404兜底逻辑,避免访问不存在的路径时出现白屏
使用提示
在/views/blog/page.php文件中,直接读取$_GET['page_slug']就能拿到当前访问的文章别名,用这个参数去数据库查询对应文章内容渲染即可。后续如果要新增其他动态路由(比如分类页/category/分类别名),只需要在default分支里追加对应的正则匹配规则就行。
内容的提问来源于stack exchange,提问作者Sandy
相关产品推荐
相关产品推荐

