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

Laravel应用部署至子目录后路由异常问题求助

解决Laravel部署到服务器子目录后的路由问题

我之前也碰到过一模一样的情况——本地跑的好好的Laravel应用,部署到服务器的子目录里就各种路由404或者跳转错位,折腾了好一会儿才捋清楚问题根源。结合你提到已经调整过public目录的.htaccess,我来分享下完整的排查和稳定解决思路,帮你把临时方案替换成更可靠的配置:

第一步:先确认部署结构是否正确

很多人踩坑都是因为部署路径没搞对:

  • 正确的做法是:把Laravel项目的整个目录放到服务器的非web根目录(比如/var/www/myapp),然后把web服务器(Apache/Nginx)的根目录指向Laravel的public文件夹。如果是子目录部署,那web服务器的子目录映射要指向/var/www/myapp/public,而不是把整个Laravel项目直接扔到web根的子目录里。
  • 举个例子:如果你的临时域名子目录是https://temp-domain.com/laravel-app,那服务器上应该是/var/www/laravel-app放整个Laravel项目,然后配置Apache把/laravel-app这个请求路径映射到/var/www/laravel-app/public。

第二步:调整Laravel的核心配置

  1. 修改.env文件:把APP_URL改成带子目录的完整地址,比如:
    APP_URL=https://temp-domain.com/laravel-app
    
  2. 清除配置缓存:部署后一定要执行这几个命令,避免旧配置残留:
    php artisan cache:clear
    php artisan route:clear
    php artisan config:clear
    

第三步:修正Public目录的.htaccess

你已经修改了这个文件,但大概率是没加上RewriteBase的配置。针对子目录场景,正确的.htaccess应该是这样(把/laravel-app/替换成你的实际子目录):

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # 关键:设置RewriteBase为你的子目录路径
    RewriteBase /laravel-app/

    # 处理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]
</IfModule>

第四步:如果用Nginx的话,调整服务器配置

要是你的服务器用的是Nginx,那得在server块里添加子目录的路由规则,替换掉默认的location /配置:

server {
    # 其他配置(监听端口、域名等)保持不变

    # 处理子目录的请求
    location /laravel-app {
        try_files $uri $uri/ /laravel-app/index.php?$query_string;
    }

    # PHP文件处理规则
    location ~ \.php$ {
        root /var/www/laravel-app/public; # 指向Laravel的public目录
        fastcgi_pass unix:/run/php/php8.2-fpm.sock; # 根据你的PHP版本调整
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

最后:检查路由写法

确保你代码里的所有链接都用Laravel的辅助函数生成,比如用route('route-name')或者url('path'),不要写硬编码的绝对路径(比如<a href="/home">)。这样Laravel会自动基于APP_URL的配置加上子目录前缀,避免跳转错误。

如果你的临时解决办法是手动在路由前加子目录,那换成上面的配置后就可以去掉这些硬编码了,后续换域名或者调整子目录也不用改代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:00:36