生产环境下无法访问Scramble生成的Laravel API文档路由docs/api
这种生产环境404的坑我之前踩过好几次,大概率是路由注册、服务器配置或者Scramble的环境设置没到位,给你列几个接地气的排查方向:
先确认Scramble路由在生产环境是否真的存在
登录你的生产服务器,跑一下php artisan route:list,看看输出里有没有/docs/api和/docs/api.json这两条路由。如果没有,那肯定是路由没注册:- 打开
config/scramble.php,检查routes.enabled的值是不是true,别是写死了只在本地启用(比如有人会写成'enabled' => app()->isLocal())。建议改成'enabled' => env('SCRAMBLE_ENABLED', true),然后在生产环境的.env文件里加一行SCRAMBLE_ENABLED=true,这样更灵活。
- 打开
检查服务器的URL重写配置
Laravel的路由依赖URL重写才能绕过index.php直接访问,比如用Nginx的话,得确认配置文件里有这段:location / { try_files $uri $uri/ /index.php?$query_string; }如果是Apache,要确保mod_rewrite模块已经开启,而且Laravel的public目录下的
.htaccess文件存在,同时服务器配置(比如vhost里)允许使用.htaccess(设置AllowOverride All)。没开重写的话,除了首页其他路由都会404。清掉Laravel的缓存试试
生产环境下Laravel会缓存路由、配置这些,要是你刚部署Scramble或者改了配置,缓存没清就会不生效。在服务器上依次跑这几个命令:php artisan route:clear php artisan config:clear php artisan cache:clear跑完再去访问文档页面试试,很多时候缓存就是罪魁祸首。
确认Scramble是作为生产依赖安装的
如果你之前是用composer require --dev dedoc/scramble安装的,那生产环境跑composer install --no-dev的时候,Scramble会被移除,自然就没路由了。打开项目的composer.json,看看dedoc/scramble是不是在require数组里,而不是require-dev。如果在dev里,就把它移到require里,然后在生产服务器重新跑composer install。检查服务器根目录指向
最后再确认下,你的Web服务器(Nginx/Apache)的根目录是不是指向了Laravel项目的public文件夹?如果指向了项目根目录,那访问/docs/api会直接找根目录下的docs文件夹,肯定找不到,必须把根目录设为public,所有请求才会经过index.php处理路由。
备注:内容来源于stack exchange,提问作者nanashixd

