Laravel应用部署至子目录后仅能访问首页,其他页面报500错误求助
解决Laravel部署在非根子目录下的500内部服务器错误
我之前也碰到过几乎一模一样的情况!你的问题核心是站点文档根目录和Laravel入口文件的路径不匹配,加上当前的.htaccess规则没有考虑到这个子目录上下文,导致除了首页之外的路由无法正确映射到myapp/index.php。下面给你几个针对性的解决方案:
方案一:修改站点文档根目录(推荐)
如果你的主机控制面板(比如cPanel、Plesk)允许修改站点的文档根目录,直接把它设置为websites/myapp——这是Laravel官方推荐的部署方式,因为myapp里存放的就是Laravel的public文件夹内容,是整个应用的入口。
修改后,你现有的websites/myapp/.htaccess规则完全不需要调整,就能正常处理所有路由请求,因为此时index.php就在站点的根目录下,重写规则可以直接匹配。
方案二:调整.htaccess规则(无法修改文档根目录时用)
如果必须把站点的文档根目录留在websites,那需要调整重写规则,让所有请求都转发到myapp/index.php:
- 先删除
websites/myapp/.htaccess(避免规则冲突) - 在
websites/.htaccess中添加以下规则:
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # 处理Authorization头(Laravel认证功能需要) RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # 移除URL末尾的斜杠 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # 把所有非文件/文件夹的请求转发到myapp的index.php RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ myapp/index.php [L] </IfModule>
额外检查项
除了规则调整,还要确认两个关键点:
- Laravel配置:打开Laravel主目录下的
config/app.php,确保'url'配置项设置为你的域名:
同时确保根目录'url' => env('APP_URL', 'https://mydomain.com'),.env文件里的APP_URL也是正确的。 - 文件夹权限:Laravel的
storage和bootstrap/cache文件夹需要有写入权限给Apache服务器用户(通常是www-data),可以通过SSH执行以下命令:chmod -R 755 storage bootstrap/cache chown -R www-data:www-data storage bootstrap/cache
为什么原来的规则会报错?
你原来的.htaccess放在websites/myapp目录下,当用户访问mydomain.com/about_us时,Apache会在websites目录下查找about_us文件/文件夹——找不到就会触发500错误,因为没有规则告诉它要把这个请求转发到myapp/index.php。只有当文档根指向myapp,或者在根目录的.htaccess里添加转发规则,请求才能正确到达Laravel的入口文件。
内容的提问来源于stack exchange,提问作者Rafael Munoz
相关产品推荐
相关产品推荐

