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

Laravel 8共享主机环境下移除URL中的public路径

解决Laravel 8子文件夹部署时URL带public的问题

嘿,我之前在共享主机上部署Laravel子项目时也碰到过几乎一模一样的问题,结合你说的服务器只读取public目录下.htaccess的情况,给你一套能解决问题的步骤:

第一步:调整项目根目录的入口文件

  1. 进入public_html/project_name目录(也就是你的Laravel项目根目录)
  2. 把里面的server.php重命名成index.php——这一步你之前可能做过,但接下来的路径修改很关键
  3. 打开这个新的index.php,找到下面两行代码:
    require __DIR__.'/../vendor/autoload.php';
    $app = require_once __DIR__.'/../bootstrap/app.php';
    
    把它们改成这样:
    require __DIR__.'/vendor/autoload.php';
    $app = require_once __DIR__.'/bootstrap/app.php';
    
    原因是现在index.php在项目根目录,不需要再往上一级找vendor和bootstrap文件了。

第二步:修改public目录下的.htaccess

因为你的服务器只认public文件夹里的.htaccess,所以我们得在这里调整规则,让请求指向项目根目录的新入口文件:
进入public_html/project_name/public,替换.htaccess的内容为:

Options -MultiViews -Indexes
RewriteEngine On

# 保留Authorization头,避免登录等功能出问题
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

# 移除URL尾部的斜杠
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]

# 把所有非文件、非目录的请求重写到项目根目录的index.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ ../index.php [L]

# 确保静态资源(css、js、图片)能正常加载
RewriteCond %{REQUEST_URI} !^/project_name/public/
RewriteRule ^(css|js|images)/(.*)$ $1/$2 [L,NC]

第三步:检查权限和配置

  • 确保storage和bootstrap/cache目录有可写权限,一般设为755或者775就可以,具体看你的主机要求
  • 打开Laravel根目录的.env文件,把APP_URL改成https://maindomain.in/project_name,避免系统生成错误的URL
  • 最后记得清一下浏览器缓存,或者用无痕模式测试,不然之前的重定向缓存可能会影响结果

按这些步骤做完后,你访问https://maindomain.in/project_name应该就能直接打开站点,不会再跳转到带public的URL了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 18:08:11