Laravel5.5下如何用.htaccess或routes.php实现单URL的301重定向?
故障原因
你原先的.htaccess规则不生效通常有两个核心原因:
- 规则放置顺序错误:Laravel默认的
.htaccess存在前端控制器转发规则,所有请求会被优先转发到public/index.php处理,若你的重定向规则写在该段规则之后,会直接被跳过不会触发 - 规则写法不规范:
Redirect指令的目标地址如果是绝对路径必须带http:///https://协议头,否则会被识别为相对路径,导致跳转路径异常
解决方案
提供两种适配Laravel 5.5的实现方式,按需选择即可:
方案1:修改.htaccess配置(性能更高,不经过Laravel内核处理)
打开项目public目录下的.htaccess文件,在RewriteEngine On行之后、Laravel默认的前端转发规则之前,添加如下规则:
RewriteRule ^es/services/?$ /es/servicios [L,R=301,NC]
参数说明:
^es/services/?$精准匹配/es/services或/es/services/路径,不会误匹配带该前缀的其他子路径L表示命中该规则后不再执行后续重写规则,避免被后续Laravel默认规则覆盖R=301标识为永久重定向,测试阶段可以先改为R=302避免浏览器缓存错误规则NC为可选参数,标识匹配路径时不区分大小写
配置完成后清空浏览器缓存即可生效。
方案2:通过Laravel路由配置(易维护,无需修改服务器配置)
直接在routes/web.php中添加重定向路由即可,无需调整服务器配置:
Route::redirect('/es/services', '/es/servicios', 301);
如果你的多语言路由已经统一配置了es前缀组,也可以写在组内简化写法:
Route::prefix('es')->group(function () { Route::redirect('/services', '/servicios', 301); // 其余/es前缀的路由保持不变 });
内容的提问来源于stack exchange,提问作者rmontanodev
相关产品推荐
相关产品推荐

