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
相关产品推荐
相关产品推荐

