rewriterule顺序决定请求处理结果,须遵循高频优先、精确在前、通用靠后、安全兜底原则:高频路径首置并加[l];拦截类规则(如禁.php、强https)须前置;真实文件/目录检查需紧贴入口规则前;伪静态映射按路径具体性或层级深度排序。

Apache 的 RewriteRule 顺序不是随意写的,它直接决定请求是否被正确处理、会不会被误改、甚至引发无限重定向或 404。规则按从上到下的顺序逐条匹配,一旦某条规则生效(匹配成功且条件满足),后续行为就取决于它的标志(比如 [L]),而不是“跳过所有”。所以排顺序的核心逻辑是:高频优先、精确在前、通用靠后、安全兜底。
高频访问路径放最前面,并加 [L]
用户最常访问的 URL(比如首页 `/`、产品列表 `/products`、API 入口 `/api/v1/`)应该最先定义,并立即用 `[L]` 终止当前轮次。这样 Apache 不会浪费时间去匹配后面几十条不相关的规则。 - 示例:RewriteRule ^/$ /index.php [L]
RewriteRule ^/products$ /catalog.php [L]
先做条件拦截,再做路由转发
屏蔽非法请求、强制跳转这类“决策型”规则,必须放在业务路由之前,否则可能被绕过。 - 屏蔽 `.php` 直接访问、禁止敏感目录、强制 HTTPS,都属于“守门员”,应优先执行:RewriteCond %{THE_REQUEST} \.php[\s?]
RewriteRule \.php$ - [F,L]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L]
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
真实文件/目录检查要前置
静态资源(`.js`、`.css`、图片)和真实存在的文件不应走 PHP 入口。这类判断靠 `RewriteCond` 实现,必须紧贴在统一入口规则之前: - 正确写法:RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php [L]
伪静态映射按路径长度或语义层级排
多个内容类规则(如 `/news/123` → `/news.php?id=123`,`/user/john` → `/profile.php?name=john`)之间要有明确优先级: - 更具体的路径写在前面,避免被泛匹配吞掉。例如:RewriteRule ^/news/([0-9]+)$ /news.php?id=$1 [L,QSA]
RewriteRule ^/news/([^/]+)/?$ /category.php?slug=$1 [L,QSA]
不复杂但容易忽略










