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

Htaccess RewriteRule导致/news/访问404错误,原因是什么?

问题原因分析

你遇到的/news/(带结尾斜杠)404错误,核心问题出在现有规则的匹配逻辑上:

你的单篇新闻规则RewriteRule ^news/([^/]*)$ new.php?title=$1 [NC,QSA,L]中,[^/]*会匹配空字符串,当访问/news/时,该规则会误匹配这个请求,将空字符串作为title参数传递给new.php,而new.php无法处理空title的情况,因此返回404。

而访问/news(不带斜杠)时,该规则不会触发(因为规则要求路径以news/开头),请求会落到最后一条规则,被转发到news.php(假设你存在这个列表页),因此可以正常访问。

修复方案

修改规则逻辑,区分新闻列表页和单篇新闻页的匹配,同时统一URL格式避免重复内容:

RewriteEngine On

# 统一URL格式:去掉/news/和分类页的结尾斜杠
RewriteRule ^news/$ /news [R=301,L]
RewriteRule ^news/categories/([^/]+)/$ /news/categories/$1 [R=301,L]

# 旧URL重定向到新URL
RewriteCond %{THE_REQUEST} \s/category\.php\?catid=(\S+)\s [NC]
RewriteRule ^ /news/categories/%1? [R=301,L]

RewriteCond %{THE_REQUEST} \s/new\.php\?title=(\S+)\s [NC]
RewriteRule ^ /news/%1? [R=301,L]

RewriteCond %{REQUEST_URI} !/(exception\.php|admin) [NC]
RewriteCond %{THE_REQUEST} \s/([^.]*)\.php/?\s [NC]
RewriteRule ^ /%1? [R=301,L]

# 单独处理新闻列表页(匹配/news和/news/)
RewriteRule ^news/?$ news.php [NC,L]
# 处理分类页
RewriteRule ^news/categories/([^/]+)$ category.php?catid=$1 [NC,QSA,L]
# 处理单篇新闻(要求/news/后至少有一个非斜杠字符)
RewriteRule ^news/([^/]+)$ new.php?title=$1 [NC,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+?)/?$ $1.php [L]

关键修改说明

  1. 添加URL统一重定向:将/news/重定向到/news,避免重复内容,同时让用户访问带斜杠的URL时自动跳转到标准格式。
  2. 拆分新闻列表与单篇规则:新增专门匹配/news和/news/的规则,指向新闻列表页news.php(需确保该文件存在)。
  3. 严格单篇新闻匹配:将单篇新闻规则中的[^/]*改为[^/]+,确保只有/news/xxx格式的请求才会被转发到new.php,避免空参数传递。

内容的提问来源于stack exchange,提问作者Péter Gergő

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 12:55:18