PHP简单动态URL路由实现求助:友好URL重写失败及动态变量路由配置问题
解决动态URL重写与路由问题
我来帮你理清当前配置的问题并给出可行的解决方案:
问题1:.htaccess未传递动态路由参数
你的现有RewriteRule只是把请求转发到index.php,但没有把用户请求的路径(比如/link-one)作为参数传递过去,导致index.php无法获取动态的slug值,自然没法处理任意的友好URL。
修正后的.htaccess配置
RewriteEngine On # 跳过实际存在的文件和目录(比如css、js、图片等静态资源) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 将请求路径作为page_slug参数传递给index.php,[L]表示这是最后一条规则,[QSA]保留原有查询参数 RewriteRule ^(.*)$ index.php?page_slug=$1 [L,QSA]
问题2:index.php硬编码路由且require用法错误
你用switch硬编码了/link-one,无法处理动态变化的slug;而且require __DIR__ . '/views/page.php?page_slug=link-one'是错误的——require的参数是文件路径,不能带查询字符串,PHP会把?page_slug=link-one当成路径的一部分,所以才会提示“文件/目录不存在”。
修正后的index.php代码
<?php // 获取传递过来的page_slug,根路径时为空字符串 $pageSlug = $_GET['page_slug'] ?? ''; // 处理首页(根路径) if (empty($pageSlug)) { require __DIR__ . '/views/index.php'; exit; } // 这里建议先做数据库验证:检查该slug是否存在于你的页面表中 // 示例(假设用PDO连接数据库): // $pdo = new PDO('mysql:host=localhost;dbname=your_db', 'username', 'password'); // $stmt = $pdo->prepare("SELECT * FROM pages WHERE slug = ?"); // $stmt->execute([$pageSlug]); // $page = $stmt->fetch(PDO::FETCH_ASSOC); // 模拟页面存在的判断,实际替换为数据库查询结果 $pageExists = true; if ($pageExists) { // 将slug传递给page.php(可以用$_GET或者直接定义变量) $_GET['page_slug'] = $pageSlug; require __DIR__ . '/views/page.php'; } else { // 页面不存在时返回404状态码并加载404页面 http_response_code(404); require __DIR__ . '/views/404.php'; }
你的page.php无需大改
原来的page.php里用$_GET['page_slug']获取参数的逻辑完全可以保留,现在index.php已经把正确的slug传递过来了,直接用它查询数据库即可:
<?php $pageSlug = $_GET['page_slug'] ?? ''; // 这里执行数据库查询,根据slug获取页面内容 // 比如:$stmt = $pdo->prepare("SELECT content FROM pages WHERE slug = ?"); // $stmt->execute([$pageSlug]); // $pageContent = $stmt->fetchColumn();
这样修改后,任何像/your-custom-slug的请求都会被转发到index.php,动态加载对应的page.php并传递slug参数,完美实现你想要的友好动态URL。
内容的提问来源于stack exchange,提问作者Sandy
相关产品推荐
相关产品推荐

