网站末尾带斜杠的URL返回404错误的原因及解决求助
解决URL末尾带斜杠404的问题
问题根源
你的现有.htaccess有三个核心问题导致带斜杠的URL报错:
- 最后那条自动添加
.php后缀的规则会错误匹配带斜杠的请求,比如/about/会被重写成/about/.php,这显然是不存在的文件,直接触发404。 - 缺少强制统一URL末尾斜杠的规则,没有先把不带斜杠的请求跳转到带斜杠的版本,反而让带斜杠的请求进入错误的重写逻辑。
- 规则顺序不合理,通用的
.php重写规则放在了特定的blog路由之前,可能导致路由被覆盖。
修改后的完整.htaccess代码
AcceptPathInfo Off RewriteEngine On RewriteBase / # 拦截双斜杠请求返回404 RewriteCond %{THE_REQUEST} // RewriteRule ^ - [L,R=404] # 拦截PHP文件后带额外路径的请求返回404 RewriteRule \.php/.+$ [L,NC,R=404] # 强制跳转到www前缀的域名 RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L] # 强制为所有非文件、非目录的请求添加末尾斜杠 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !/$ RewriteRule ^(.*)$ /$1/ [R=301,L] # blog文章路由(仅匹配带末尾斜杠的请求) RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^blog/([A-Za-z0-9-]+)/$ inner.php?slug=$1 [NC,L] # 为不带斜杠、不带后缀的请求自动添加.php后缀 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !/$ RewriteRule ^([^\.]+)$ $1.php [NC,L]
关键修改说明
- 添加强制斜杠规则:先把所有不带斜杠的非文件请求跳转到带斜杠的版本,确保URL格式统一,同时避免后续规则错误匹配。
- 修正
.php重写规则:新增条件%{REQUEST_URI} !/$,排除带斜杠的请求,防止生成xxx/.php这种无效路径。 - 调整规则顺序:把特定的
blog路由放在通用的.php重写之前,确保路由优先匹配。
注意事项
- 测试前清空浏览器缓存,因为301重定向是永久缓存的,旧缓存可能导致测试结果不准确。
- 确保服务器开启了
mod_rewrite模块,如果是Apache服务器,需要确认配置文件中AllowOverride All已开启,否则.htaccess规则不会生效。
内容的提问来源于stack exchange,提问作者Joel
相关产品推荐
相关产品推荐

