如何在Laravel项目.htaccess中配置主域名重定向且不影响域名别名访问
正确的.htaccess配置方案
旧配置失效的原因
你现有配置存在两个核心问题,直接导致规则不生效:
RewriteRule默认匹配的是请求的URI路径(即域名之后的部分),无法直接匹配完整域名URL,你写的"^http://www.maindomain.com"永远不会命中任何请求- 没有单独判断请求的Host头,无法区分主域名和别名域名的请求
适配需求的完整配置
需要把自定义重定向规则放在Laravel默认重写规则的最前面(.htaccess规则从上到下顺序匹配生效),完整配置如下:
RewriteEngine On # 自定义主域名重定向规则(置于最前端) # 判断请求Host是否为主域名,NC参数表示不区分大小写 RewriteCond %{HTTP_HOST} ^www\.maindomain\.com$ [NC] # 匹配主域名的所有请求,直接重定向到目标地址 # R=301表示永久重定向,L表示停止后续所有重写规则匹配 RewriteRule ^.*$ https://www.redirectedpage.com [R=301,L] # 以下为Laravel默认请求转发规则,保持原有配置即可 # 非真实文件、目录的请求全部转发到入口文件index.php RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ index.php [L]
规则逻辑说明
- 仅当请求Host为
www.maindomain.com(无论走http还是https协议)时,才会触发重定向 - Host为
www.alias.maindomain.com的请求不会命中重定向条件,会直接走后面的Laravel正常处理流程,完全保留原有访问状态 - 测试阶段可以先把
R=301改成R=302临时重定向,避免浏览器缓存导致测试结果异常,确认生效后再换回301永久重定向
为什么不推荐用Laravel路由层实现
如果路由层实现未生效,通常是因为主域名的请求在进入Laravel入口前就已经被Web服务器的其他配置拦截,或者域名绑定规则未配置正确。直接在.htaccess最上层配置重定向规则,不依赖Laravel的业务逻辑加载,稳定性更高,也不受框架版本、路由配置的影响。
内容的提问来源于stack exchange,提问作者jkstallard
相关产品推荐
相关产品推荐

