Laravel Passport部署子目录后视图及增删改查功能异常求助
我之前踩过一模一样的坑!把Laravel项目放到子目录后,Passport的视图加载、客户端增删改全罢工,折腾了好几天才捋顺所有需要调整的地方,给你列几个核心步骤:
1. 校准应用基础配置与Passport路由前缀
先确认.env里的APP_URL是完整的子目录地址:
APP_URL=http://my-site.com/xyz
同步config/app.php里的URL配置(避免缓存导致的不一致):
'url' => env('APP_URL', 'http://my-site.com/xyz'),
关键是Passport的路由配置,不能只改passport.php,要在AuthServiceProvider的boot方法里指定带目录的完整前缀:
public function boot() { $this->registerPolicies(); // 必须包含子目录前缀 Passport::routes(null, ['prefix' => 'xyz/oauth']); }
这样所有Passport的OAuth路由都会自动带上xyz/oauth前缀,和子目录匹配。
2. 修复Passport视图的静态资源路径
Passport自带的视图默认从根目录加载CSS/JS,部署到子目录后会找不到资源。先发布视图到本地:
php artisan vendor:publish --tag=passport-views
然后打开resources/views/vendor/passport下的所有视图文件,比如clients/index.blade.php,把资源引用加上子目录前缀:
<!-- 原路径 --> <link rel="stylesheet" href="{{ asset('vendor/passport/css/app.css') }}"> <!-- 修改后 --> <link rel="stylesheet" href="{{ asset('xyz/vendor/passport/css/app.css') }}">
JS文件的引用也要做同样修改,确保所有静态资源都能正确加载。
3. 调整前端组件的API请求路径
你已经改了axios的baseURL,但要确保Passport的Vue组件里的请求路径和它匹配。比如打开resources/js/components/passport/Clients.vue,检查请求URL:
// 如果已经设置了axios.defaults.baseURL='http://my-site.com/xyz' axios.get('/oauth/clients') // 这样就会自动拼接成 http://my-site.com/xyz/oauth/clients
如果baseURL设置没生效,也可以直接写完整路径:
axios.get('/xyz/oauth/clients')
注意要把baseURL的设置放在所有组件加载之前,比如放在resources/js/bootstrap.js里。
4. 清理缓存确保配置生效
最后一定要清掉路由和配置缓存,很多时候修改了配置但缓存没更新导致不生效:
php artisan route:clear php artisan config:clear php artisan cache:clear
生产环境下重新生成缓存:
php artisan config:cache php artisan route:cache
额外检查:服务器配置(以Nginx为例)
如果以上步骤都做了还是有问题,要确保服务器把子目录的请求转发给Laravel的入口文件:
location /xyz { try_files $uri $uri/ /xyz/index.php?$query_string; }
这样所有/xyz开头的请求都会交给Laravel处理,不会返回404。
我当时就是漏了视图资源路径和服务器配置,折腾了好久才搞定,按这些步骤来应该能解决你的问题!
内容的提问来源于stack exchange,提问作者shofin

