CORS报错提示来源不匹配http://localhost:5173,但本地无该端口进程且React运行在3000端口的问题排查求助
CORS报错提示来源不匹配http://localhost:5173,但本地无该端口进程且React运行在3000端口的问题排查求助
我最近碰到了一个特别诡异的CORS问题,想请大家帮忙排查下:
我在从本地PHP后端获取数据时触发了如下错误:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://localhost/login.php. (Reason: CORS header ‘Access-Control-Allow-Origin’ does not match ‘http://localhost:5173’). TypeError: NetworkError when attempting to fetch resource.
但离谱的是,我的Mac上完全没有任何进程在5173端口运行,我的React项目明明是跑在http://localhost:3000的啊!
我已经尝试过的排查操作
- 尝试修改Apache的
httpd.conf配置文件,把端口改成5173,但重启后Apache还是在8080端口提供服务 - 反复确认React开发服务器确实运行在3000端口,没有任何变动
- 清空了浏览器缓存,并且完全重启了Apache和React开发服务器
- 用命令排查5173端口的占用情况,但查不到任何占用该端口的程序
- 上周用同样的fetch请求和
login.php接口完全能正常工作,没有任何问题
后端login.php代码
<?php header("Access-Control-Allow-Origin: *"); header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS"); header("Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With"); header("Access-Control-Allow-Credentials: true"); header("Content-Type: application/json"); session_start(); require "dbsession.php"; $dcdb = getDbSes(); if ($dcdb) { $reqbody = file_get_contents('php://input'); $jsonar = json_decode($reqbody, TRUE); // Simple registration check - just 6 lines added if (isset($jsonar["register"]) && $jsonar["register"] === true) { handleRegistration($jsonar, $dcdb); return; } // End of addition if (trim($jsonar["pass"]) == "" || trim($jsonar["email"]) == "") { $_SESSION["uid"] = ""; $ret = []; $ret["success"] = false; $ret["message"] = "Nonexistent user or wrong password"; $ret["mid"] = 1; echo json_encode($ret); return; } loginOrCreate($jsonar, 0, $dcdb); } function loginOrCreate($jsonar, $loopcheck, $dcdb) { if ($loopcheck > 1) return false; $selectuser = $dcdb->prepare("SELECT uid, hash FROM users WHERE email=:email;"); $selectuser->bindValue(":email", $jsonar["email"]); $pwd = $jsonar["pass"]; if ($selectuser->execute()) { if ($selectuser->rowCount() == 0) { $insertuser = $dcdb->prepare("INSERT INTO users (email, hash) values (:email, :hash);"); $insertuser->bindValue(":email", $jsonar["email"]); $insertuser->bindValue(":hash", password_hash($jsonar["pass"], PASSWORD_BCRYPT)); if ($insertuser->execute()) { loginOrCreate($jsonar, $loopcheck+1, $dcdb); } else { $_SESSION["uid"] = ""; $ret = []; $ret["success"] = false; $ret["message"] = "Nonexistent user or wrong password"; $ret["mid"] = 1; echo json_encode($ret); } } else { $row = $selectuser->fetch(); $hash = $row["hash"]; $uid = $row["uid"]; $selectuser->closeCursor(); if (password_verify($jsonar["pass"], $hash)) { $_SESSION["uid"] = $uid; $ret = []; $ret["success"] = true; $ret["message"] = "User exists and has a uid."; $ret["mid"] = 1; echo json_encode($ret); } else { $_SESSION["uid"] = ""; $ret = []; $ret["success"] = false; $ret["message"] = "Nonexistent user or wrong password"; $ret["mid"] = 1; echo json_encode($ret); } } } else { $ret = []; $ret["success"] = false; $ret["message"] = "Nonexistent user or wrong password"; $ret["mid"] = 1; echo json_encode($ret); } } // Added registration function - simple and clean function handleRegistration($jsonar, $dcdb) { if (trim($jsonar["pass"]) == "" || trim($jsonar["email"]) == "") { $ret = []; $ret["success"] = false; $ret["message"] = "Email and password required"; $ret["mid"] = 1; echo json_encode($ret); return; } // Check if user already exists $selectuser = $dcdb->prepare("SELECT uid FROM users WHERE email=:email;"); $selectuser->bindValue(":email", $jsonar["email"]); if ($selectuser->execute()) { if ($selectuser->rowCount() > 0) { // User already exists $ret = []; $ret["success"] = false; $ret["message"] = "User already exists"; $ret["mid"] = 2; echo json_encode($ret); } else { // Create new user $insertuser = $dcdb->prepare("INSERT INTO users (email, hash) values (:email, :hash);"); $insertuser->bindValue(":email", $jsonar["email"]); $insertuser->bindValue(":hash", password_hash($jsonar["pass"], PASSWORD_BCRYPT)); if ($insertuser->execute()) { // 原代码此处未写完,保持原样 } } } }
实在搞不懂为什么浏览器会认定请求来源是5173端口——明明我的React跑在3000,这个端口也根本没被占用。有没有朋友遇到过类似的情况,或者能给我一些新的排查方向?




