htaccess 301重定向问题:.php跳转后缺失末尾斜杠需调整
现有规则的问题定位
现有规则无法实现带斜杠跳转的核心原因有两点:
- 处理.php后缀301跳转的规则在拼接目标地址时,没有给捕获到的无后缀路径补充末尾斜杠,导致跳转结果为无斜杠的裸路径
- 缺少对裸路径请求的统一拦截,直接访问无斜杠的伪静态路径时会直接触发内部重写,不会强制跳转到带斜杠的版本,容易产生重复收录问题
调整后可直接使用的完整规则
RewriteEngine On RewriteBase / # 规则1:将带.php后缀的请求301重定向到对应带末尾斜杠的伪静态地址 RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC] # 核心修改:跳转目标从原%1调整为%1/ RewriteRule ^ %1/ [R=301,L] # 规则2:拦截无后缀且不带斜杠的请求,301跳转到带斜杠的对应路径,避免重复索引 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*?)$ $1/ [R=301,L] # 规则3:将带末尾斜杠的伪静态请求内部映射到对应php文件,不触发对外跳转 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.*?)/$ $1.php [NC,L]
跳转逻辑校验
- 当访问
website.com/seo.php时,会被第一条规则匹配,直接301跳转到website.com/seo/,完全符合预期 - 当访问无斜杠的裸路径
website.com/seo时,会被第二条规则匹配,统一301跳转到带斜杠的版本,避免搜索引擎同时收录两种地址形式 - 带末尾斜杠的请求会被第三条规则内部重写到对应的php文件处理业务,用户不会感知到地址变化
- 所有规则都加入了真实物理目录判断,不会对网站内的真实目录路径产生错误跳转,支持多级路径的伪静态映射
内容的提问来源于stack exchange,提问作者user14368691
相关产品推荐
相关产品推荐

