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

Laravel部署在子目录时路由失效问题求助

解决方案

1. 调整Nginx配置

核心是让Nginx正确处理子目录请求,将去掉子目录前缀后的路径传递给Laravel的index.php,同时确保静态文件路径正确。替换原有的location配置部分:

server {
    server_tokens off;
    listen 80;
    autoindex off;
    server_name dev1.example.com;
    root /var/www/html/dev1;

    access_log /home/dev1/nginx-access.log;
    error_log /home/dev1/nginx-error.log debug;
    rewrite_log on;

    index index.php index.html;
    client_max_body_size 100M;

    # 处理遗留URL重写
    location ~* ^/([A-Za-z0-9\-_]+)/control\.php/(.*)$ {
        rewrite ^/([A-Za-z0-9\-_]+)/control\.php/(.*)$ /$1/$2 last;
    }

    # 匹配子目录应用
    location ~* ^/(?<appid>[A-Za-z0-9\-_]+)/ {
        # 指向Laravel的public目录(末尾加/避免路径拼接错误)
        alias /var/www/html/dev1/$appid/public/;
        try_files $uri $uri/ @laravel_rewrite;

        # 处理PHP请求
        location ~ \.php$ {
            if (!-f $request_filename) { return 404; }

            fastcgi_pass unix:/var/run/php-fpm/www.sock;
            fastcgi_index index.php;

            # 关键:传递去掉子目录前缀的路径给Laravel
            fastcgi_param SCRIPT_FILENAME $request_filename;
            fastcgi_param REQUEST_URI /$2;
            fastcgi_param PATH_INFO $2;

            fastcgi_param HTTPS on;
            include fastcgi_params;
        }

        # 静态文件缓存处理
        location ~* \.(jpg|jpeg|gif|css|svg|png|js|map|ico|html|xml|txt|woff|woff2)$ {
            expires 30d;
            add_header Cache-Control "public, immutable";
        }
    }

    # Laravel路由重写规则
    location @laravel_rewrite {
        rewrite ^/([A-Za-z0-9\-_]+)/(.*)$ /$1/index.php/$2 last;
    }
}

配置说明

  • 用(?<appid>[A-Za-z0-9\-_]+)/精确匹配子目录结尾的斜杠,避免与其他路由冲突
  • alias指向public目录时末尾加/,确保静态文件路径拼接正确
  • PHP块中通过REQUEST_URI和PATH_INFO传递纯净路径,让Laravel路由无需匹配子目录前缀

2. Laravel环境配置调整

修改项目根目录的.env文件,设置正确的URL参数:

APP_URL=https://dev1.example.com/laravel8
ASSET_URL=https://dev1.example.com/laravel8

说明

  • APP_URL用于Laravel生成绝对URL的基础地址
  • ASSET_URL确保静态资源(CSS、JS、图片)的路径正确指向子目录

3. 验证路由

调整完成后,不带子目录前缀的路由即可正常生效:

// 现在有效
Route::get('/', function () {
    return view('welcome');
});

// 现在有效
Route::get('/welcome', function () {
    return view('welcome');
});

关键问题解析

原Nginx配置的核心问题是:传递给Laravel的REQUEST_URI包含了子目录前缀(如/laravel8/welcome),导致Laravel路由必须匹配完整路径。调整后,Nginx将/welcome传递给Laravel,路由就能直接匹配根路径和子路由。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:02:44