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

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:

  1. 先删除websites/myapp/.htaccess(避免规则冲突)
  2. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:20:23