.htaccess URL重写无法匹配带连字符“-”的路径返回404错误
故障根因
- 核心问题出在
.htaccess的第一条重写规则正则匹配范围不全:规则^([a-zA-Z0-9]+)$仅允许匹配大小写字母、数字,没有加入连字符-的匹配支持,因此/article-name这类带连字符的路径根本无法命中这条将文章别名传给index.php的路由规则。 - 规则停止标记缺失:第一条文章路由规则没有加
[L](匹配即停止重写)标记,未命中该规则的带连字符路径会直接落到最后一条重写逻辑——该逻辑会给请求路径拼接.php后缀查找同名文件,由于不存在article-name.php这类文件,Apache直接返回404,根本不会进入PHP的路由分发流程。 - 额外笔误:你贴出的路由分发PHP代码标注为
article.php是错误的,这段接收$_GET参数做分流、查询文章的逻辑是入口文件index.php的代码,代码中查询到文章后include 'article.php'的逻辑也能印证这一点,如果入口文件放错位置,即使重写规则正确也无法正常加载内容。
修复方案
- 调整
.htaccess配置,修正文章路由的正则匹配范围,给所有路由规则加上正确的停止标记,补充目录判断避免异常重写,修改后的完整配置如下:
RewriteEngine On # 文章路由:补充连字符匹配,加上L标记匹配即停止,QSA保留原有URL参数 RewriteRule ^([a-zA-Z0-9-]+)$ index.php?ID=$1 [L,QSA] RewriteRule ^c/([^/]+)?$ index.php?CAT=$1 [L,QSA] RewriteRule ^topic/([^/]+)?$ index.php?topic=$1 [L,QSA] # 仅当请求路径不是真实存在的文件、目录时,才执行.php后缀自动补全 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^\.]+)$ $1.php [NC,L]
注意:正则字符集中的连字符
-必须放在字符集末尾,否则会被识别为范围运算符导致匹配逻辑异常。
- 确认路由分发逻辑存放在站点根目录的
index.php中,不要把这段入口代码写到article.php里。
配置生效后,带连字符的文章路径会被正确转发到index.php,接收到对应ID参数后完成文章查询加载,不会再触发404错误。
内容的提问来源于stack exchange,提问作者rukavinaet
相关产品推荐
相关产品推荐

