Laravel中GET请求URI超5000字符提交大文本报错如何解决?
问题原因
- 414状态码含义为URI Too Long,你当前使用GET请求传递文本内容,所有参数都拼接在URL中,而浏览器、Web服务器(Nginx/Apache等)普遍对URL长度有2KB~8KB的限制,5000字符的文本已经超出长度上限,会被服务器直接拦截返回414错误
- 后续的JSON解析报错是因为服务器返回的是错误提示页面的HTML内容,并非你预期的JSON格式,所以
response.json()解析失败
解决方案
核心修改是把GET请求改为POST请求,大文本内容放在请求体中传递,不要拼接在URL里。
1. 前端Blade JS代码修改
function sendRequest() { var items = document.getElementById("item").value; // 移除URL参数拼接,参数全部放在请求体中 var url = {{url}}; // 构造FormData存放请求参数 const requestBody = new FormData(); requestBody.append('items', items); requestBody.append('id', '{{$id}}'); fetch(url, { method: 'POST', headers: { // Laravel POST请求必须携带CSRF令牌,否则会报419状态码错误 'X-CSRF-TOKEN': '{{ csrf_token() }}' }, body: requestBody }).then(response => response.json()) .then(responseObject => { // 原有业务逻辑保持不变 }).catch(err => { // 建议添加错误捕获逻辑,方便后续排查问题 console.error('请求异常:', err); }) }
2. 路由规则修改
找到你原路由定义,把请求类型从GET改为POST:
// 原路由类似:Route::get('/receive', [YourController::class, 'receivebyGet']); // 修改为POST类型 Route::post('/receive', [YourController::class, 'receivebyGet']);
3. 后端Controller逻辑
原有逻辑不需要修改,Laravel的Request实例会自动读取POST请求体中的参数,$request->items可以正常获取到提交的文本内容:
public function receivebyGet(Request $request) { $lineArray = array(); $slipData = explode("\n", $request->items); // 原有业务逻辑保持不变 }
超大文本额外配置(大于10M时需要)
如果后续需要传递更大体积的文本,需要修改服务端配置避免被拦截:
- 修改
php.ini配置,调整post_max_size和upload_max_filesize参数到你需要的大小,比如设置为20M - 如果你使用Nginx作为Web服务器,需要在站点配置中添加
client_max_body_size 20M;规则
内容的提问来源于stack exchange,提问作者user14232549
相关产品推荐
相关产品推荐

