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

.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'的逻辑也能印证这一点,如果入口文件放错位置,即使重写规则正确也无法正常加载内容。
修复方案
  1. 调整.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]

注意:正则字符集中的连字符-必须放在字符集末尾,否则会被识别为范围运算符导致匹配逻辑异常。

  1. 确认路由分发逻辑存放在站点根目录的index.php中,不要把这段入口代码写到article.php里。

配置生效后,带连字符的文章路径会被正确转发到index.php,接收到对应ID参数后完成文章查询加载,不会再触发404错误。

内容的提问来源于stack exchange,提问作者rukavinaet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:09:25