POST提交位置选择菜单后返回页面触发ERR_CACHE_MISS错误的技术求助
解决POST提交后返回页面出现ERR_CACHE_MISS的问题
首先咱们得搞清楚这个错误的根源:当你通过POST提交表单到mix_menu.php后,浏览器会记录这个POST请求的会话。当你从mix_menu.php返回原页面时,浏览器会尝试重新发送之前的POST请求来加载原页面,但由于缓存中没有保存该POST请求的响应,就会抛出ERR_CACHE_MISS错误。
下面给你几个靠谱的解决方案,按推荐程度排序:
1. 使用PRG模式(Post/Redirect/Get)—— 最佳实践
这是Web开发中解决POST重提交问题的标准方案,核心思路是:处理完POST请求后,服务器发起一个重定向(GET请求),让用户的浏览器跳转到一个新的GET页面,这样后续返回操作只会触发GET请求,不会再涉及POST数据。
修改mix_menu.php的代码如下:
<?php session_start(); // 启动会话,用来存储位置信息(方便后续使用) if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 获取POST的位置信息 $storename = $_POST['location']; // 这里可以添加你的业务逻辑,比如存储到数据库、设置会话变量等 $_SESSION['selected_location'] = $storename; // 重定向到当前页面(或其他你需要的页面),用GET方式 header('Location: mix_menu.php'); exit; // 一定要exit,避免后续代码执行 } // 处理GET请求的逻辑,比如从会话中读取之前选中的位置 $selected_location = isset($_SESSION['selected_location']) ? $_SESSION['selected_location'] : ''; ?>
这样操作后,用户提交表单后会被重定向到mix_menu.php的GET请求,此时点击返回按钮,浏览器会回到原表单页面(GET请求),完全不会触发POST重提交的问题,自然也就不会出现ERR_CACHE_MISS了。
2. 保留原表单的选中状态(可选)
如果你希望用户返回原表单页面时,之前选择的位置能自动选中,可以在原表单页面通过会话变量来恢复选中状态:
修改原表单页面的代码(假设原页面是index.php):
<?php session_start(); // 获取会话中保存的选中位置,默认空字符串 $selected_loc = isset($_SESSION['selected_location']) ? $_SESSION['selected_location'] : ''; ?> <div id="container" class="container justify-content-center"> <form action="mix_menu.php" method="POST" class="form-horizontal justify-content-center"> <div class="selectWrapper"> <select type="text" name="location"> <option value="loc1" <?php echo $selected_loc === 'loc1' ? 'selected' : ''; ?>>Location 1</option> <option value="loc2" <?php echo $selected_loc === 'loc2' ? 'selected' : ''; ?>>Location 2</option> <option value="loc3" <?php echo $selected_loc === 'loc3' ? 'selected' : ''; ?>>Location 3</option> <option value="loc4" <?php echo $selected_loc === 'loc4' ? 'selected' : ''; ?>>Location 4</option> <option value="loc5" <?php echo $selected_loc === 'loc5' ? 'selected' : ''; ?>>Location 5</option> <option value="loc6" <?php echo $selected_loc === 'loc6' ? 'selected' : ''; ?>>Location 6</option> <option value="loc7" <?php echo $selected_loc === 'loc7' ? 'selected' : ''; ?>>Location 7</option> <option value="loc8" <?php echo $selected_loc === 'loc8' ? 'selected' : ''; ?>>Location 8</option> <option value="loc9" <?php echo $selected_loc === 'loc9' ? 'selected' : ''; ?>>Location 9</option> </select> </div> <br> <div class="form-group row justify-content-center"> <div class="offset-sm-auto text-center"> <!-- 注意:你原来的按钮type是mix-submit,这是无效的,要改成submit才能提交表单 --> <button class="btn-lg" type="submit">Authorize</button> </div> </div> </form> </div>
3. 改用GET方法提交(不推荐,仅临时场景)
如果你的业务场景不涉及敏感数据,也可以把表单的提交方法改成GET,这样位置信息会被放在URL参数里,返回页面时不会触发POST重提交:
修改原表单的method属性:
<form action="mix_menu.php" method="GET" class="form-horizontal justify-content-center">
然后在mix_menu.php中用$_GET['location']获取位置信息:
$storename = $_GET['location'];
不过这种方法会把位置参数暴露在URL中,不适合敏感数据,所以仅作为临时解决方案。
内容的提问来源于stack exchange,提问作者NoFlaire
相关产品推荐
相关产品推荐

