Apache URL重写实现分类目录美化,核心是将动态链接如/category.php?id=123转为语义化路径如/tech或/products/electronics,关键在于真实反映内容层级并确保正确路由;需先明确扁平、多级或带前缀的路径结构,再配置对应Rewrite规则,同时规避静态资源误伤、404缺失等常见问题。

Apache URL 重写实现分类目录美化,核心是把类似 /category.php?id=123 这样的动态链接,变成更简洁、语义清晰的路径,比如 /tech 或 /products/electronics。关键不是“去掉.php”,而是让URL真实反映内容层级和意图,同时确保服务器能正确路由到对应逻辑。
明确分类路径结构再动手
先想清楚你希望分类 URL 长什么样,这直接影响规则设计:
-
扁平结构:如
/news、/blog、/about—— 适合一级分类,规则简单 -
多级嵌套:如
/products/mobile/iphone—— 需要支持可变深度,通常用递归匹配或统一入口处理 -
带前缀区分:如
/category/news、/article/how-to-rewrite—— 最稳妥,避免与文章、页面等 URL 冲突
不建议直接用 /news 和 /how-to-rewrite 共用同一正则模式,否则 Apache 无法判断请求意图(见知识库中“相同URL格式冲突”说明)。
基础重写规则写法(以扁平分类为例)
假设你有一个 category.php 脚本,接收 slug 参数识别分类,例如访问 /tech 实际执行 category.php?slug=tech:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_-]+)/?$ category.php?slug=$1 [L,QSA]
说明:
-
!-f和!-d确保真实存在的文件或目录(如css/style.css或images/)不被重写 -
^([a-zA-Z0-9_-]+)/?$匹配单段路径,支持结尾斜杠可选 -
[QSA]保留原始查询参数(如/tech?page=2→category.php?slug=tech&page=2)
支持多级分类的实用方案
对于 /products/computers/laptops 这类路径,不推荐为每层写独立规则(维护成本高),推荐两种方式:
-
统一捕获 + PHP 解析:用一条规则把整个路径传给脚本
RewriteRule ^(.+)$ category.php?path=$1 [L,QSA]
然后在category.php中用explode('/', $_GET['path'])拆解层级,查数据库或配置决定是否为有效分类 -
限制最大深度 + 分层匹配:例如最多三级
RewriteRule ^([a-z0-9_-]+)/([a-z0-9_-]+)/([a-z0-9_-]+)/?$ category.php?parent=$1&child=$2&grand=$3 [L,QSA]
适合结构固定、无需动态扩展的场景
避免常见坑点
美化目录容易踩的几个实际问题:
-
别忘了设置 RewriteBase:如果站点不在根目录(如部署在
/myapp/),需加RewriteBase /myapp/,否则重写后路径错乱 -
静态资源别被误伤:CSS、JS、图片等应放在明确目录(如
/assets/),并在规则前用RewriteCond排除 -
404 处理要配套:重写后,分类不存在时 PHP 应返回 404 状态码,不能只显示空白页;Apache 可配
ErrorDocument 404 /404.php -
不要忽略 trailing slash 一致性:决定用
/tech还是/tech/,并在全站统一,必要时加跳转规则避免重复内容
不复杂但容易忽略

















