Laravel 8共享主机环境下移除URL中的public路径
解决Laravel 8子文件夹部署时URL带public的问题
嘿,我之前在共享主机上部署Laravel子项目时也碰到过几乎一模一样的问题,结合你说的服务器只读取public目录下.htaccess的情况,给你一套能解决问题的步骤:
第一步:调整项目根目录的入口文件
- 进入
public_html/project_name目录(也就是你的Laravel项目根目录) - 把里面的
server.php重命名成index.php——这一步你之前可能做过,但接下来的路径修改很关键 - 打开这个新的
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
相关产品推荐
相关产品推荐

