Laravel 7 Web路由CORS问题及Apache部署后系列异常求助
Laravel部署到Apache后的系列问题排查与解决方案
让我们一步步拆解你遇到的这些问题,从初始部署到后续的Passport、路由和CORS问题,逐个定位解决:
一、初始登录出现500错误的原因与修复
500是服务器内部错误,先别瞎猜,先看Apache错误日志是关键(路径是/var/log/apache2/error.log),结合你的部署步骤,常见原因有这几个:
- 目录权限不足:Laravel的
storage和bootstrap/cache目录需要www-data用户有读写权限,虽然你用www-data克隆了项目,但克隆后这些目录的权限可能没到位,执行以下命令修复:sudo chown -R www-data:www-data /var/www/html/laravel/storage /var/www/html/laravel/bootstrap/cache sudo chmod -R 775 /var/www/html/laravel/storage /var/www/html/laravel/bootstrap/cache - .env配置错误:比如数据库连接信息填错、
APP_URL设置不对,都会导致核心功能异常。检查.env里的APP_URL是否匹配你的生产环境地址(比如http://你的服务器IP/laravel或域名),数据库参数是否正确。 - PHP扩展缺失:Laravel依赖mbstring、xml、mysql等PHP扩展,如果这些没装,Composer安装的依赖会无法正常加载。用
php -m查看已装扩展,缺失的话用apt安装,比如:sudo apt install php-mbstring php-xml php-mysql
二、执行passport:install后Web路由全错的修复
Passport安装会新增OAuth相关路由和数据表,出错大概率是流程遗漏或缓存冲突:
- 遗漏数据库迁移:Passport需要创建oauth相关的数据表,你可能没执行迁移命令,补上:
sudo -u www-data php artisan migrate - 缓存未更新:之前你执行了
config:cache,Passport安装后路由和配置有变化,需要重新缓存:sudo -u www-data php artisan route:cache sudo -u www-data php artisan config:clear && sudo -u www-data php artisan config:cache - 服务提供者未注册:虽然
passport:install通常会自动注册,但还是检查下config/app.php的providers数组里有没有Laravel\Passport\PassportServiceProvider::class,没有的话手动加上。
三、Web路由指向127.0.0.1:8000的问题
这完全是APP_URL配置的锅,Laravel所有路由生成都依赖这个环境变量:
- 修改
.env文件里的APP_URL,改成你的生产环境地址,比如:APP_URL=http://你的服务器IP/laravel # 或者用域名:APP_URL=http://your-domain.com/laravel - 重新缓存配置让修改生效:
sudo -u www-data php artisan config:cache - 另外检查代码里的路由生成方式,确保用
route()辅助函数(比如route('login')),而不是硬编码127.0.0.1:8000这种地址。
四、Web路由仍存在CORS问题的解决
你已经搞定了API路由的CORS,但Web路由的CORS问题是因为Fruitcake的CORS默认只针对API路径,需要调整配置覆盖Web路由:
- 先发布CORS配置文件(如果还没做):
sudo -u www-data php artisan vendor:publish --tag="cors" - 打开
config/cors.php修改配置:- 把
paths字段改成包含你的Web路由路径,比如:
测试阶段也可以临时设为'paths' => ['api/*', 'login', 'logout', 'password/reset/*'],'paths' => ['*'](生产环境别这么干,要精确限制路径) - 调整
allowed_origins为你的前端域名,比如'allowed_origins' => ['https://你的前端域名.com'],测试用'allowed_origins' => ['*'] - 确保
allowed_methods包含Web路由用到的请求方法(GET, POST, PUT, DELETE等)
- 把
- 重新缓存配置:
sudo -u www-data php artisan config:cache - 最后检查Apache的
mod_headers模块是否启用(CORS需要响应头支持),启用并重启Apache:sudo a2enmod headers sudo systemctl restart apache2
注意:如果是直接在浏览器访问Web路由页面,不会触发CORS问题,只有前端通过AJAX跨域请求Web路由时才会出现这个问题,要区分场景排查。
内容的提问来源于stack exchange,提问作者Zekura
相关产品推荐
相关产品推荐

