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

如何用通用RewriteRule实现PHP页面数组的URI重写无需逐页配置

问题:实现mod_rewrite通用规则,无需逐页添加RewriteRule

我编写了一个包含页面数组的PHP索引文件,通过变量避免每次新增页面都修改数组。当前.htaccess中需为每个页面单独添加RewriteRule,将/?p=xxx格式的链接转为/xxx格式。希望使用通用规则,无需逐页添加规则,但尝试多种语法均未成功,寻求正确的mod_rewrite实现方法。

现有PHP代码

$geturi = $_SERVER['REQUEST_URI']; // /about
// 替换原正则写法,更安全高效
$geturi = ltrim($geturi, '/'); // 转为about
$geturi = strtolower($geturi);

$pages = array ( 
  'home' => array('name' => 'home' , 'title' => 'County Road' , 'page' => 'incdoc/default'),
  "$geturi" => array('name' => "$geturi", 'title' => "$geturi" , 'page' => "incdoc/$geturi"),
  '403' => array('name' => '403' , 'title' => '403 Forbidden' , 'page' => 'incdoc/403'),
  '404' => array('name' => '404' , 'title' => '404 Not Found' , 'page' => 'incdoc/404')
);

if (isset ($_GET['p'])) {
  $pageID = $_GET['p'];
  if (! isset($pages[$pageID])) $pageID = 404;
}
else { 
  $pageID = 'home';
}
define('this_page', $pages[$pageID]['name']);

当前.htaccess规则(逐页添加)

RewriteRule ^about/?$ ?p=about  [NC]

未成功的通用规则尝试

RewriteRule ^$uri/?$ ?p=$uri  [NC]

正确的通用mod_rewrite实现

完整.htaccess配置

RewriteEngine On

# 排除真实存在的文件和目录,避免静态资源被重写
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# 通用重写规则:将/xxx 转换为 ?p=xxx
RewriteRule ^([a-zA-Z0-9_-]+)/?$ ?p=$1 [NC,L]

规则说明

  • 排除静态资源:RewriteCond %{REQUEST_FILENAME} !-f 和 !-d 确保真实存在的文件(如CSS、JS、图片)和目录不会被重写,保证静态资源正常访问。
  • 匹配页面路径:^([a-zA-Z0-9_-]+)/?$ 匹配URL中一级路径的页面标识,允许末尾带斜杠。正则范围可根据页面命名规则调整(比如允许中文可加入\p{Han})。
  • 传递参数:?$1 将匹配到的页面标识作为p参数的值传递给索引文件。
  • 规则标记:[NC] 表示不区分大小写,[L] 表示匹配后停止执行后续规则,避免冲突。

内容的提问来源于stack exchange,提问作者tbint

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:25:18