Laravel搜索表单使用POST方法时出现404页面未找到错误
POST方法搜索表单出现404错误,GET方法正常的问题排查
问题描述
使用POST方法的搜索表单点击提交时返回404未找到错误,但改用GET方法时功能正常。已确认能连接到运行中的127.0.0.1:3000服务器并获取结果,尝试过多种网上方案仍未解决。
相关代码
表单代码
<form action="{{ route('search') }}" method="POST"> {{ csrf_field() }} <div class="form-group"> <div class=""> <textarea class="form-control" type="textarea" name="search" placeholder="Search..." required></textarea> </div> <div class="submit"> <button class="btn btn-success pull-right" type="submit"><i class="glyphicon glyphicon-search" aria-hidden="true"></i> Search</button> </div> </div> </form>
路由文件(web.php)
Route::post('/search','App\Http\Controllers\SearchController@search')->name('search');
控制器代码(SearchController.php)
public function search(Request $request) { try { // 获取请求中的搜索值 $search = $request->input('search'); $host = "127.0.0.1"; $port = 3000; $timeout=15; $sk = fsockopen($host, $port, $errnum, $errstr, $timeout); foreach(explode("\r\n", $search) as $line) { $final = $line; } fwrite($sk, $final); fclose($sk); } catch(Exception $e){ return response($e->getMessage(), 500); } return view('search', compact('final')); }
已执行的操作及结果
- 执行
php artisan route:list,确认路由已注册:
GET|HEAD / ....................................... SearchController@index POST search .................................. search › SearchController@search
- 执行
php artisan optimize:clear,清空框架缓存:
INFO Clearing cached bootstrap files. events ................................. 1ms DONE views .................................. 2ms DONE cache .................................. 1ms DONE route .................................. 0ms DONE config ................................. 0ms DONE compiled ............................... 0ms DONE
- 执行
php artisan optimize,重新缓存框架文件:
INFO Caching the framework bootstrap files. config ........................................ 6ms DONE routes ........................................ 6ms DONE
解决方案尝试
1. 修正路由路径格式
路由定义中/search的前导斜杠可能导致路径匹配问题,可调整路由为:
Route::post('search','App\Http\Controllers\SearchController@search')->name('search');
或直接在表单中使用绝对路径action="/search"测试提交是否正常。
2. 验证CSRF令牌有效性
虽然表单已加入{{ csrf_field() }},但可临时关闭CSRF验证(仅测试用,生产环境禁止)排查问题:在app/Http/Middleware/VerifyCsrfToken.php的$except数组中添加路由:
protected $except = [ 'search', ];
若提交正常,说明令牌生成或会话存在异常,需检查页面渲染后的_token隐藏字段是否正确。
3. 检查服务器重写规则
- Apache:确保项目根目录的
.htaccess配置正确,包含Laravel默认的重写规则:
<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; }
重写规则错误会导致POST请求无法正确路由到Laravel,引发404。
4. 确认请求路径正确性
打开浏览器开发者工具(F12)的「网络」标签,点击搜索按钮后查看POST请求的实际URL,确认路径与路由定义一致,无多余/缺失的斜杠或域名错误。
5. 检查控制器文件有效性
确认SearchController.php存在于app\Http\Controllers目录下,文件名与类名(首字母大写)一致,命名空间正确。
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

