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]
关键修改说明
- 添加URL统一重定向:将
/news/重定向到/news,避免重复内容,同时让用户访问带斜杠的URL时自动跳转到标准格式。 - 拆分新闻列表与单篇规则:新增专门匹配
/news和/news/的规则,指向新闻列表页news.php(需确保该文件存在)。 - 严格单篇新闻匹配:将单篇新闻规则中的
[^/]*改为[^/]+,确保只有/news/xxx格式的请求才会被转发到new.php,避免空参数传递。
内容的提问来源于stack exchange,提问作者Péter Gergő
相关产品推荐
相关产品推荐

