Apache RewriteRule 规范化 URL 的核心是统一入口、消除歧义、避免重复,需用条件判断+精确匹配+内部重写;应强制统一末尾斜杠、标准化前缀与大小写、屏蔽非法路径、隐藏入口文件,并保留查询参数。
apache 的 rewriterule 要规范化 url 路径格式,核心是统一入口、消除歧义、避免重复访问,而不是简单跳转。关键在于用条件判断 + 精确匹配 + 内部重写,确保浏览器地址栏不变、服务端路由一致。
统一末尾斜杠行为
常见问题:/article 和 /article/ 被当作两个不同 URL,影响 SEO 和缓存。应强制统一为带斜杠或不带斜杠的一种形式。
- 强制添加末尾斜杠(适用于目录型结构):
<Directory "/var/www/html">
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !/$
RewriteRule ^(.+)$ $1/ [R=301,L]
</Directory> - 强制移除末尾斜杠(适用于扁平化路由,如 /post/123/ → /post/123):
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ $1 [R=301,L]
标准化路径前缀与大小写
URL 中的路径部分应保持语义清晰、格式统一。例如将 /ARTICLE/123 或 /article/123 一律转为小写并规范前缀。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 统一小写路径(需启用 mod_speling 或使用 RewriteMap;更通用做法是用 RewriteCond 判断):
RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule ^(.*)$ ${lowercase:$1} [R=301,L]
(注:需先在主配置中定义 RewriteMap lowercase int:tolower) - 规范化路径前缀,比如把 /blog/post/123 → /article/123:
RewriteRule ^/blog/post/(.*)$ /article/$1 [L,NE]
注意:这里用 [L,NE] 表示“最后一条规则”且“不转义特殊字符”,避免 query string 损坏。
屏蔽非法路径与默认文件暴露
防止用户直接访问 index.php、.htaccess、备份文件等,同时把含多余点、双斜杠、上级目录符号的路径拦截或重写。
- 拒绝含 .. 或多个连续斜杠的请求:
RewriteCond %{THE_REQUEST} \.\. [OR]
RewriteCond %{THE_REQUEST} //+
RewriteRule ^ - [F] - 隐藏入口文件,让 /index.php/article/123 → /article/123(内部重写):
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
搭配 PHP 的 PATH_INFO 使用,无需外部跳转。
保留查询参数并处理多级别重写
规范化过程中常需透传原有参数(如 ?utm_source=xx),也需避免规则链式误触发。
- 用 [QSA] 自动追加原始 query string:
RewriteRule ^/oldpage\.html$ /newpage.html [QSA,R=301,L]
访问 /oldpage.html?ref=abc → 跳转到 /newpage.html?ref=abc - 多条件组合时,每个 RewriteCond 只作用于紧随其后的 RewriteRule:
RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

















