Laravel+Vue项目PUT/DELETE请求报404但路由存在求助
解决Laravel+Vue中PUT/DELETE请求404的问题
以下是针对该问题的排查和解决步骤:
1. 确认CSRF令牌是否正确携带
Laravel对非GET请求会强制校验CSRF令牌,Vue项目中需确保请求携带有效令牌:
- 若使用axios发起请求,需在全局配置中添加请求头:
axios.defaults.headers.common['X-CSRF-TOKEN'] = window.csrfToken;
- 若为传统表单提交,需添加
@csrf和@method指令声明请求类型:
<form action="{{ route('sensor.update', $sensor) }}" method="POST"> @csrf @method('PUT') <!-- 表单内容 --> </form>
2. 检查路由模型绑定有效性
你的PUT/DELETE路由使用了隐式模型绑定{sensor},需确认:
Sensor模型的路由键为id(默认配置,若修改过需重置):
// app/Models/Sensor.php protected $routeKeyName = 'id';
- 请求URL中的
sensor参数是数据库中存在的有效ID,比如/sensor/update/1中的1必须对应真实的传感器记录。模型绑定失败时,Laravel会直接返回404。
3. 验证Vue请求发送方式
浏览器原生不支持PUT/DELETE请求,Laravel通过两种方式识别这类请求:
- 使用axios直接指定请求方法:
axios.put(`/sensor/update/${sensorId}`, formData) .then(res => { /* 处理响应 */ });
- 若用POST请求,需在请求数据中添加
_method字段声明真实请求类型:
axios.post(`/sensor/update/${sensorId}`, { _method: 'PUT', ...formData })
4. 修复路由缓存与控制器定义问题
虽然你执行过缓存清理,但仍需注意:
- 路由缓存仅支持控制器类的完整调用语法,建议将路由中的字符串方法名改为数组形式,避免缓存解析错误:
// 修改路由定义 Route::put('/update/{sensor}', [SensorController::class, 'Update'])->name('sensor.update'); Route::delete('/destroy/{sensor}', [SensorController::class, 'Destroy'])->name('sensor.destroy');
- 执行
php artisan route:clear彻底清除路由缓存后再测试。
5. 检查Web服务器配置
- Apache环境:确保
public/.htaccess文件存在且配置正确,允许PUT/DELETE请求通过:
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
- Nginx环境:确保配置文件中包含转发规则,将所有请求指向入口文件:
location / { try_files $uri $uri/ /index.php?$query_string; }
6. 排查中间件拦截问题
你的路由绑定了auth:sanctum等中间件,可暂时移除中间件测试请求是否正常。若恢复正常,再排查用户认证、会话有效性等问题。
内容的提问来源于stack exchange,提问作者JT88
相关产品推荐
相关产品推荐

