Apache URL重写正则匹配REQUEST_URI问号前路径,需用^和$锚定首尾防误匹配,优先选用[0-9]+等精确字符类,配合!-f、!-d及静态文件后缀排除条件,捕获组按序引用为$1、$2。

Apache URL 重写里的正则表达式,本质是匹配 请求路径(REQUEST_URI)中问号前的部分,不是整个 URL,也不含域名和查询参数。写对的关键在于:明确要匹配什么、排除什么、用对锚点和字符类。
匹配开头和结尾用 ^ 和 $
这是防止“误中副车”的基础。比如想把 /news/123 映射到 /article.php?id=123,规则应写成:
RewriteRule ^/news/([0-9]+)$ /article.php?id=$1 [L]- ^ 表示必须从路径最开头匹配,$ 表示必须到路径最末尾结束
- 这样
/news/123/extra或/mynews/123就不会被错误触发
常用字符类与量词要分清用途
别乱套 .*,它太宽泛容易出问题。优先用更精确的写法:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
[0-9]+匹配一个或多个数字(如 ID) -
[a-zA-Z0-9_-]+匹配字母、数字、下划线、短横线(适合 slug) -
[^./]+匹配不含斜杠和点的任意字符(常用于排除文件名) - 避免
^.*$这种全局匹配,极易引发循环重写
跳过真实文件和静态资源
重写只应对动态路径生效,CSS、JS、图片、PHP 文件本身不该被重写。常用配合条件:
-
RewriteCond %{REQUEST_FILENAME} !-f—— 当前请求不是真实文件 -
RewriteCond %{REQUEST_FILENAME} !-d—— 当前请求不是真实目录 - 再加一条:
RewriteCond %{REQUEST_URI} !\.(css|js|png|jpg|gif)$ [NC]排除常见静态后缀 - 把这些条件放在 RewriteRule 前,确保只对“不存在的路径”做重写
捕获组与引用要一一对应
括号 () 是捕获组,按从左到右顺序编号为 $1、$2……
RewriteRule ^/user/([0-9]+)/profile/([a-z]+)$ /profile.php?uid=$1&tab=$2 [L]- 访问
/user/456/profile/feed→ 后端收到$_GET['uid'] = '456',$_GET['tab'] = 'feed' - 注意:如果规则里用了
QSA标志,原有查询参数会自动追加,不用手动拼

















