You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel部署cPanel后去除URL public段并强制HTTPS的.htaccess配置方法

Laravel部署到cPanel public_html目录的.htaccess通用配置方案

问题场景

部署Laravel项目到cPanel的public_html目录时,通常会遇到两类典型问题:

  • 访问根域名时自动跳转至带/public后缀的路径,直接访问根域名偶发异常URL、404报错、页面持续加载情况,预期效果为URL无/public段,例如访问https://website.com/about时地址栏保持该形式,不显示https://website.com/public/about
  • 需要将所有HTTP请求强制跳转至HTTPS协议

原有简单重写规则RewriteRule ^(.*)$ public/$1 [L]存在偶发失效问题,初始根目录.htaccess内容如下:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

# php -- BEGIN cPanel-generated handler, do not edit
# Set the “ea-php81” package as the default “PHP” programming language.
<IfModule mime_module>
  AddHandler application/x-httpd-ea-php81 .php .php8 .phtml
</IfModule>
# php -- END cPanel-generated handler, do not edit

可用配置

注意:以下配置替换public_html根目录下的原有.htaccess内容即可,cPanel自动生成的PHP版本配置段已保留,无需手动修改;public目录下Laravel自带的默认.htaccess请保持原样,不要改动。

<IfModule mod_rewrite.c>
    RewriteEngine On

    # 强制所有请求跳转HTTPS
    RewriteCond %{HTTPS} !=on
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

    # 禁止直接访问/public路径,自动跳回无public段的地址
    RewriteCond %{REQUEST_URI} ^/public/
    RewriteRule ^public/(.*)$ /$1 [L,R=301]

    # 将所有请求转发到public目录,避免循环匹配
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

# php -- BEGIN cPanel-generated handler, do not edit
# Set the “ea-php81” package as the default “PHP” programming language.
<IfModule mime_module>
  AddHandler application/x-httpd-ea-php81 .php .php8 .phtml
</IfModule>
# php -- END cPanel-generated handler, do not edit

配置生效注意事项

  • 配置上传完成后,请清除浏览器缓存再测试,301永久重定向会被浏览器本地缓存,旧缓存会导致测试结果异常
  • 如果需要临时调试规则,可以将规则中的R=301临时改为R=302(临时重定向),调试完成后再改回301,避免缓存影响
  • 请确保项目目录权限符合Laravel要求,storage、bootstrap/cache目录权限设置为755,避免权限导致的加载异常

规则原理说明

  • HTTPS强制跳转逻辑:通过服务器变量HTTPS判断当前请求是否为加密协议,非加密请求直接返回301永久重定向到对应HTTPS地址,对搜索引擎友好
  • /public路径屏蔽逻辑:匹配所有请求路径以/public开头的访问,自动去除路径中的/public段后跳回根路径对应地址,彻底避免地址栏暴露public目录
  • 请求转发逻辑:增加两个判断条件:当请求路径对应的不是根目录下真实存在的目录、也不是真实存在的文件时,才将请求转发到public目录下处理,同时用L标记终止当前重写流程,避免原有规则无判断导致的循环重定向、偶发失效、页面无限加载问题

内容的提问来源于stack exchange,提问作者Kishan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 18:15:58