.htaccess分类重写规则失效,访问分类URL跳转到文章页求助
问题原因分析与排查解决方案
核心原因推测
目前最可能的问题是规则匹配顺序引发的意外路由,或浏览器缓存了之前错误的301重定向规则。虽然从正则表达式看,文章重写规则(^([0-9a-zA-Z]+)-[^/]+\/$)要求URL包含-,理论上不会匹配纯数字的分类URL(如/2/),但Apache重写规则是从上到下依次匹配,若存在隐性匹配逻辑或缓存干扰,会导致分类请求被错误路由到文章页面。
分步排查与解决
1. 调整重写规则顺序
将分类重写规则移到文章规则之前,分类规则的正则(纯数字)更严格,优先匹配可避免意外冲突:
RewriteEngine on # Force www RewriteCond %{HTTP_HOST} !^$ RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteCond %{HTTPS}s ^on(s)| RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] # Force SSL RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L,NE] # Rewrite categories 【移至文章规则之前】 RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([0-9]+)/?$ /category.php?categoryId=$1 [QSA,L] # Rewrite posts RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([0-9a-zA-Z]+)-[^/]+\/$ /post.php?postId=$1 [QSA,L] # Rewrite the shorteners URL RewriteRule ^recommends/([A-Za-z0-9-]+)/?$ /redirect.php?redirect=$1 [L,QSA]
2. 清除浏览器缓存或使用无痕模式
若之前配置过错误规则,浏览器可能缓存了301永久重定向。直接清除缓存,或用无痕窗口访问/2/,验证跳转是否恢复正常。
3. 开启Apache重写日志排查匹配过程
在Apache虚拟主机配置或httpd.conf中开启重写日志,查看请求的具体匹配路径:
RewriteLog "/var/log/apache2/rewrite.log" RewriteLogLevel 3
重启Apache后访问/2/,日志会显示该请求匹配了哪条重写规则,直接定位问题根源。
4. 验证请求是否到达目标PHP文件
在category.php和post.php开头添加日志代码,确认请求被路由到了哪个文件:
// category.php 开头 file_put_contents('category_debug.log', date('Y-m-d H:i:s') . ' | categoryId: ' . $_GET['categoryId'] . "\n", FILE_APPEND); // post.php 开头 file_put_contents('post_debug.log', date('Y-m-d H:i:s') . ' | postId: ' . $_GET['postId'] . "\n", FILE_APPEND);
访问/2/后查看日志:
- 若
category_debug.log有记录:说明重写规则生效,问题出在category.php内部(如隐性跳转逻辑) - 若
post_debug.log有记录:说明分类URL意外匹配了文章规则,需进一步检查正则表达式或服务器配置
5. 检查上级目录的.htaccess文件
Apache会继承上级目录的重写规则,若网站根目录的上级存在其他.htaccess文件,可能覆盖或干扰当前规则,需逐一排查。
内容的提问来源于stack exchange,提问作者colinreedy674
相关产品推荐
相关产品推荐

