Laravel 5.4+VueJS部署后POST请求报405 Method Not Allowed错误求助
解决Laravel 5.4 + VueJS部署后POST请求405 Method Not Allowed的问题
我之前也踩过类似的坑,结合你的代码和描述,给你梳理几个大概率能解决问题的方向,按优先级来排查:
1. 先确认服务器的重写规则是否配置正确
本地运行正常但部署后出问题,大概率是服务器的URL重写没配置好,导致Laravel无法正确处理POST请求:
- Apache环境:
- 确保
mod_rewrite模块已经开启 - 把Laravel根目录下的
.htaccess文件复制到public目录(或者确认服务器的网站根目录指向了Laravel的public文件夹),标准规则如下:<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # Handle Authorization Header RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # Send Requests To Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
- 确保
- Nginx环境:
在你的站点配置里添加转发规则,确保所有请求都指向Laravel入口文件:
配置完成后记得重启Nginx服务。location / { try_files $uri $uri/ /index.php?$query_string; }
2. 检查CORS组件的配置是否真的生效
虽然你说已经安装了CORS组件,但可能配置没到位:
- 如果你用的是
barryvdh/laravel-cors,打开config/cors.php,确认:allowed_methods数组里包含'POST'paths设置了['api/*']来匹配你的API路由
- 打开浏览器开发者工具(F12)的Network标签,重新发送请求,查看响应头里是否有
Access-Control-Allow-Methods: POST, GET, ...字段。如果没有,说明CORS配置未生效,可重新发布配置文件:php artisan vendor:publish --provider="Barryvdh\Cors\ServiceProvider"
3. 确认Vue请求的URL是否正确
本地和服务器的路径差异容易导致这个问题:
- 你的Vue代码里请求路径是
"api/sendbooking",如果服务器上项目不是根域名部署(比如在子目录),或者当前页面路径不是根路径,相对路径会拼接成错误URL。建议改成绝对路径:"/api/sendbooking"(前面加斜杠) - 也可以在Vue的HTTP配置里设置全局baseURL,简化后续请求:
// 若使用vue-resource Vue.http.options.root = '/api'; // 之后请求可简化为 this.$http.post("sendbooking", this.booking) - 同样在Network标签里查看实际发送的请求URL,确认是否和预期一致。
4. 验证Laravel路由是否正确注册
路由缓存或冲突可能导致POST请求找不到对应路由:
- 在服务器上运行
php artisan route:list,查看输出里是否有POST | api/sendbooking | BookingController@setBooking这条记录 - 如果看不到,先清除路由缓存:
php artisan route:clear,再重新查看 - 同时确认没有其他路由和这个POST路由冲突(比如同名GET路由、路由参数覆盖等)
5. 排查服务器层面的请求限制
部分服务器的安全插件、WAF或防火墙会拦截POST请求:
- 可临时关闭服务器的安全插件(比如Apache的mod_security)测试
- 查看服务器错误日志(Apache的
error.log、Nginx的error.log),里面可能有拦截POST请求的相关记录
最后再核对下你的代码
你的Vue请求代码:
this.$http.post("api/sendbooking", this.booking) .then(function (response){ console.log(response) })
建议把路径改成"/api/sendbooking"避免相对路径问题;
你的路由代码:
Route::post('/sendbooking',[ 'uses' => 'BookingController@setBooking' ]);
这段代码没问题,因为api.php本身已被Laravel路由组加上/api前缀。
内容的提问来源于stack exchange,提问作者Sandun Isuru Niraj
相关产品推荐
相关产品推荐

