You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 19:53:10