Laravel配置.htaccess移除www时错误跳转public_html路径问题
问题原因
跳转后带/public_html/index.php的核心原因是规则执行顺序错误:
- 站点根目录的
.htaccess最先被Apache加载执行,你原来的配置会把所有请求直接重写到public_html/index.php - 你把移除www前缀的301跳转规则放在了
public_html目录下的配置文件里,等这条规则触发时,请求URI已经被加上了/public_html/前缀,跳转时自然会带出这个多余路径 - 原去www规则硬编码了http协议,没有适配HTTPS,会造成不必要的二次跳转。
修复步骤
1. 修改站点根目录的.htaccess
把去www的域名规范化规则放到所有重写规则的最前面,在请求被转发到public_html目录之前执行,就不会出现路径污染问题,直接替换为以下内容:
Options +SymLinksIfOwnerMatch RewriteEngine On # 最优先执行www移除规则 RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [R=301,L,QSA] # 保留原有Installatron相关放行规则 RewriteCond %{REQUEST_FILENAME} deleteme\.\w+\.php RewriteRule (.*) - [L] # 转发请求到public_html目录,静态文件直接返回不经过PHP解析 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ public_html/$1 [L]
注意:原根目录规则直接把所有请求转发给
public_html/index.php,会导致css、js、图片等静态资源必须走PHP解析,性能差还可能出现路径错误,改成上面的目录转发写法可以直接返回静态资源,和Laravel官方推荐的服务器配置逻辑一致。
2. 修改public_html目录下的.htaccess
删除里面重复的去www规则,避免规则冲突,保留Laravel运行必要的原生规则即可,直接替换为以下内容:
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # 处理Authorization请求头 RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # 非目录路径移除末尾斜杠 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # 请求转发到Laravel入口文件 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
Hostinger环境额外注意事项
- 改完配置后必须清除浏览器缓存、Hostinger面板自带的站点缓存,301是永久跳转,浏览器会长期缓存旧的跳转结果,不清缓存会看不到修改效果
- 检查Hostinger面板「域名」-「重定向」页面有没有配置额外的www跳转规则,存在的话全部删除,避免和
.htaccess规则冲突 - 如果开启了Hostinger自带的Cloudflare CDN,需要同步清空CDN缓存后再测试
效果验证
配置完成后依次测试以下场景,确认跳转结果符合预期:
- 访问
http://www.mysite.com、https://www.mysite.com、http://mysite.com,最终都跳转到https://mysite.com - 访问任意内页比如
www.mysite.com/about,最终跳转到https://mysite.com/about,不会出现/public_html路径、不会跳转到首页
内容的提问来源于stack exchange,提问作者Ricardinho
相关产品推荐
相关产品推荐

