
本文介绍如何利用 PHP 的 $_GET 超全局变量和 URL 查询参数(如 ?page=about)在单一入口文件中动态加载不同内容模块,兼顾简洁性、安全性与可维护性。
本文介绍如何利用 php 的 `$_get` 超全局变量和 url 查询参数(如 `?page=about`)在单一入口文件中动态加载不同内容模块,兼顾简洁性、安全性与可维护性。
在现代 Web 开发中,“单页多视图”是一种轻量级的路由方案——它不依赖前端框架或复杂后端路由系统,而是通过 URL 参数(如 index.php?page=about)控制服务端动态渲染对应内容。这种方式减少了物理文件数量,保持 URL 干净(如避免 /about.php、/contact.php 等冗余路径),同时便于统一管理布局与逻辑。
✅ 安全地获取并校验参数
首先,绝不可直接使用 $_GET['page'] —— 未经处理的用户输入极易引发文件路径遍历、XSS 或远程文件包含等安全风险。推荐使用 filter_var() 进行白名单式过滤:
$page = filter_var($_GET['page'] ?? '', FILTER_SANITIZE_STRING);
?? '' 提供了空值安全默认值,避免未定义索引警告;FILTER_SANITIZE_STRING(PHP 8.1+ 已弃用,但对简单字母数字参数仍有效)可移除危险字符。更严谨的做法是结合白名单校验:
$allowed_pages = ['home', 'about', 'contact', 'privacy'];
$page = in_array($_GET['page'] ?? '', $allowed_pages)
? $_GET['page']
: 'home'; // 默认首页
? 动态加载内容:推荐使用 require_once
相比重定向(header('Location: ...')),服务端包含(include/require)更符合“单页多视图”的设计目标——它保持 URL 不变、不触发额外 HTTP 请求、且能共享主页面的公共布局(如 <header></header>、<footer></footer>):
// index.php
<title>My Site</title><nav>...</nav><!-- 动态内容区 --><?php $allowed_pages = ['home', 'about', 'contact', 'privacy'];
$page = $_GET['page'] ?? 'home';
$page = in_array($page, $allowed_pages) ? $page : 'home';
require_once "pages/{$page}.php"; // 如 pages/about.php
?><footer>© 2024 My Site</footer>
对应地,各模块文件(如 pages/about.php)仅需输出纯内容片段,无需重复 HTML 结构:
<!-- pages/about.php --> <h1>About Us</h1> <p>We are a passionate team building great things.</p>
⚠️ 注意事项与最佳实践
-
禁止用户控制完整文件路径:切勿直接拼接
$_GET['page']到require中(如require $_GET['page'].'.php'),否则可能被利用为 LFI(本地文件包含)漏洞。 -
统一错误处理:对非法
page值,应显示 404 页面或跳转至首页,而非空白或报错。 -
SEO 友好性:若需搜索引擎收录,建议后续配合
mod_rewrite将?page=about伪静态化为/about/,提升 URL 可读性。 -
扩展性考虑:当页面增多时,可将路由逻辑封装为函数或引入简易路由类,避免
if-else堆砌。
综上,URL 参数驱动的单页架构是一种低门槛、高可控性的入门级路由方案。只要坚持参数白名单校验、服务端安全包含、结构职责分离,即可在零框架依赖下构建清晰、健壮、易于维护的多视图网站。











