You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:为单层级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:35:15