.htaccess重写规则冲突:如何让文章与分类匹配规则共存?
问题根本原因
你的判断完全正确,规则失效的核心原因如下:
- 文章和分类的两条重写规则正则匹配模式完全一致,均匹配站点根目录下的单级无斜杠路径
- 规则末尾的
[L]标记含义为「匹配成功后立即终止后续所有规则执行」,因此所有符合模式的请求都会被路由到article.php,分类规则永远不会被触发
可行解决方案
方案1:通过正则区分内容类型(无需修改路径结构)
如果你的分类ID为纯数字、文章slug包含字母或其他非数字字符,可以直接调整正则规则区分两类请求:
RewriteEngine on RewriteRule ^$ /index.php [L] # 分类规则前置,仅匹配纯数字的单级路径 RewriteRule ^(\d+)$ /cat.php?id=$1 [L] # 文章规则匹配所有其他单级路径 RewriteRule ^([^/]*)$ /article.php?slug=$1 [L]
如果分类和文章的命名格式无法通过正则区分,建议使用下一种方案。
方案2:增加语义路径前缀(生产环境更推荐)
就是你之前测试可行的方案,给不同类型的资源增加统一的路径前缀,从根源上避免规则冲突,后续扩展其他页面类型也更方便:
RewriteEngine on RewriteRule ^$ /index.php [L] # 分类路径统一带cat前缀 RewriteRule ^cat/([^/]*)$ /cat.php?id=$1 [L] # 文章规则保持无前缀也不会发生冲突 RewriteRule ^([^/]*)$ /article.php?slug=$1 [L]
该方案还可以避免文章slug和分类ID重名导致的匹配错误,可维护性更高。
内容的提问来源于stack exchange,提问作者a31336
相关产品推荐
相关产品推荐

