求助:为单层级PHP菜单网站实现Clean/Pretty URL
解决PHP单层级页面的Clean URL问题
看起来你现在的问题出在.htaccess规则和现有PHP代码的逻辑不匹配,导致页面加载失败,咱们一步步来修复:
1. 修正.htaccess规则
你之前的规则把请求转发到了index.php?url=$1,但你的PHP代码还是依赖$_GET['p']来加载页面,而且规则本身可能触发不必要的循环或者错误捕获。替换成下面的规则:
RewriteEngine On # 忽略真实存在的文件和目录,确保CSS/JS等静态资源能正常访问 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 将非文件/目录的请求转发到index.php,把URL路径作为p参数 RewriteRule ^([a-zA-Z0-9_-]+)$ index.php?p=$1 [L] # 处理根目录请求,默认加载home页面 RewriteRule ^$ index.php?p=home [L]
这个规则的核心作用:
- 跳过真实存在的文件/目录,避免静态资源被错误重写
- 把
/services这类路径转换成index.php?p=services,完美匹配你原有的PHP加载逻辑 - 访问根域名时自动加载home页面
2. 增强PHP代码的安全性(可选但强烈建议)
你现有代码include('sites/'.$_GET['p'] . '.php');存在目录遍历风险,比如恶意用户构造特殊参数可能读取服务器上的敏感文件。建议添加过滤逻辑:
<?php // 定义所有允许访问的页面列表,根据你的实际页面补充 $allowed_pages = ['home', 'services', 'about', 'contact']; $page = isset($_GET['p']) ? $_GET['p'] : 'home'; // 检查请求的页面是否合法,不合法则加载404页面 if (!in_array($page, $allowed_pages)) { include('sites/404.php'); exit; } // 加载合法页面 include('sites/' . $page . '.php'); ?>
3. 更新导航链接
把navigation.php里的链接从?p=home改成干净的路径格式:
<ul class="nav navbar-nav"> <li> <a href="/home">Home</a> </li> <li> <a href="/services">Services</a> </li> <!-- 其他菜单项同理修改 --> </ul>
为什么之前的规则导致页面空白?
你原来的规则把请求转发到index.php?url=$1&query=%1,但你的代码还是尝试加载sites/'.$_GET['p'] . '.php',此时$_GET['p']不存在,相当于加载一个不存在的sites/.php文件,所以页面显示空白。
按照上面的步骤调整后,应该就能正常实现你想要的Clean URL效果了。
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

