
本文详解如何通过合理配置 .htaccess 重写规则,使 PHP 能稳定获取 $_GET 中的变量(如 sub、content),避免因规则顺序、MultiViews 干扰或路径匹配不精确导致参数丢失。
本文详解如何通过合理配置 .htaccess 重写规则,使 php 能稳定获取 `$_get` 中的变量(如 `sub`、`content`),避免因规则顺序、multiviews 干扰或路径匹配不精确导致参数丢失。
在使用 Apache 的 mod_rewrite 实现 SEO 友好 URL(如 /subject/index/sub/web-technology/)时,一个常见误区是:URL 看似成功重写,但 PHP 却无法通过 $_GET['sub'] 获取值。这通常并非 PHP 代码问题,而是 .htaccess 规则配置不当所致。
✅ 正确的重写规则结构
核心原则有三:
- 禁用 MultiViews(防止 Apache 自动解析并覆盖 GET 参数);
- 将语义化路由规则置于最前(确保优先匹配,避免被后续的 .php 补全规则拦截);
- 使用精确正则捕获,避免贪婪匹配和路径歧义。
以下是推荐的 .htaccess 配置(适用于单参数场景,如 sub=web-technology):
# 必须关闭 MultiViews,否则会干扰 QUERY_STRING 传递
Options +FollowSymLinks -MultiViews
RewriteEngine On
# ✅ 优先处理 /subject/index/sub/{slug}/ 形式(支持可选尾部斜杠)
RewriteRule ^subject/index/sub/([^/]+)/?$ /subject/index.php?sub=$1 [L,QSA]
# ✅ 后续处理 PHP 文件自动补全(仅当 .php 文件真实存在时)
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.php -f
RewriteRule ^ %{REQUEST_URI}.php [L]? 关键说明:
立即学习“PHP免费学习笔记(深入)”;
Web Accessibility (WCAG 2 AA))下载将 WCAG 2 AA 无障碍标准应用于设计系统、UI 组件和网页——通过可运行的验证器进行对比度计算,采用设计 token 模式使颜色天生可访问,设定排版和焦点状态规则,并提供语义检查清单。适用于构建或审查 UI。
- ([^/]+) 确保只捕获 slug 中不含 / 的部分(如 web-technology),避免误吞后续路径;
- /?$ 表示末尾斜杠可选,统一兼容 /sub/xxx 和 /sub/xxx/;
- [QSA](Query String Append)标志可选,若需保留原始查询参数(如 ?utm_source=xxx)则建议加上;
- [L] 表示“最后一条规则”,阻止后续规则执行,保证逻辑可控。
✅ 多参数重写示例(如 sub=digital-logic&content=this-is-content)
若需支持类似 /subject/content/sub/digital-logic&content/this-is-content/ 的双参数结构,应单独编写一条高优先级规则:
# 支持两个 slug 参数:sub 和 content(注意 & 符号需在路径中转义为字面量) RewriteRule ^subject/content/sub/([^/&]+)&content/(.+)$ /subject/content.php?sub=$1&content=$2 [L,QSA]
⚠️ 注意事项:
- URL 中的 & 在路径里是普通字符,不是查询分隔符,因此必须显式写在 RewriteRule 模式中;
- (.+) 用于捕获 content 值(支持含 -、_、/ 等常见 slug 字符),但建议配合 urlencode() 输出前端链接以规避特殊字符问题;
- 若 content 值可能含 & 或 /,更健壮的做法是改用固定分隔符(如 /sub/{a}/content/{b}/),再调整正则为:
RewriteRule ^subject/content/sub/([^/]+)/content/([^/]+)/?$ /subject/content.php?sub=$1&content=$2 [L,QSA]
✅ PHP 端安全接收与使用
规则生效后,$_GET['sub'] 和 $_GET['content'] 将正常可用。但仍需注意:
// ✅ 推荐:先校验参数是否存在,再过滤
$sub = $_GET['sub'] ?? '';
$content = $_GET['content'] ?? '';
// ✅ 使用 PDO 预处理防注入(比 mysqli_real_escape_string 更安全)
$stmt = $pdo->prepare("SELECT * FROM subjects WHERE slug = ?");
$stmt->execute([$sub]);
$subject = $stmt->fetch();
// ❌ 不要直接对未定义变量调用 mysqli_real_escape_string(会触发警告)
// $subject = mysqli_real_escape_string($conn, $_GET['sub']); // 危险!✅ 调试技巧
- 在 index.php 开头临时添加 var_dump($_SERVER['REQUEST_URI'], $_GET); 查看实际接收到的 URI 和参数;
- 启用 Apache 重写日志(需管理员权限):LogLevel alert rewrite:trace3;
- 确保 .htaccess 文件位于网站根目录或对应子目录(如 /subject/),且服务器允许覆盖配置(AllowOverride All)。
只要规则顺序合理、正则精准、MultiViews 关闭,PHP 就能像处理传统 ?sub=xxx 一样可靠地获取重写后的变量——这才是现代 URL 重写的正确打开方式。



















