Laravel:如何通过.htaccess移除URL中public并强制HTTPS?现有配置失效
解决Laravel移除public路径并强制HTTPS跳转的问题
我看到你现在的问题是根目录的.htaccess规则顺序导致HTTPS强制跳转没有生效——因为你先执行了转发到public的规则,并且用了[L]标志,这会让Apache直接停止处理后续的HTTPS跳转规则,所以永远不会触发HTTP到HTTPS的重定向。
下面是修正后的配置方案,保证两个需求同时生效:
根目录.htaccess 修改方案
把根目录的.htaccess替换成以下内容:
<IfModule mod_rewrite.c> RewriteEngine on # 第一步:强制HTTP跳转至HTTPS RewriteCond %{HTTPS} !on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # 第二步:将请求转发至public目录(隐藏public路径) RewriteCond %{REQUEST_URI} !^/public/ RewriteRule ^(.*)$ /public/$1 [L] </IfModule>
关键调整说明:
- 规则顺序调换:先处理HTTPS强制跳转,再转发到public目录。这样所有HTTP请求会先被重定向到HTTPS,再执行public路径的隐藏逻辑。
- 修正
REQUEST_URI匹配规则:把!^public改成!^/public/,避免匹配到类似public.html这类带public字符串的请求路径,匹配更精准。 - 保留
[L]标志:每个规则的[L]确保当前规则执行后停止后续处理,避免冲突。
public目录.htaccess 保持默认
你当前public目录下的Laravel默认.htaccess不需要修改,它负责处理Laravel的路由逻辑,和根目录的规则不会冲突。
测试注意事项
因为301重定向会被浏览器永久缓存,测试前请:
- 清除浏览器的缓存和Cookie
- 或者使用浏览器的隐私模式访问,避免缓存影响测试结果
这样配置后,无论是访问http://yourdomain.com还是http://yourdomain.com/any-path,都会自动跳转到https://yourdomain.com/any-path,且URL中不会出现/public/路径。
内容的提问来源于stack exchange,提问作者Teretto
相关产品推荐
相关产品推荐

