AJAX调用PHP代理无法正确获取内网state.xml资源问题求助
问题排查与解决方案
核心问题排查点
- 参数传递校验缺失:当前PHP代码直接读取
$_GET['path'],未做存在性校验,参数传递失败时会抛出Notice错误干扰正常返回,也无法直观判断是否拿到路径参数。 - 请求错误无日志:curl请求目标地址失败时不会返回任何错误提示,无法区分是路径获取失败还是目标地址访问异常。
- 同步请求逻辑冗余:你当前使用同步XMLHttpRequest(
open第三个参数为false),send方法会阻塞到请求完成,readyState == 4的判断逻辑虽然不影响参数传递,但会导致页面刷新时卡顿。
调整后的代码
JS代码
<script type="text/javascript"> var proxyName = "proxy.php"; var refreshTimeSec = 3; var xmlDoc = false; var timeOutID = 0; // 兼容旧版IE的XHR创建逻辑 if (window.ActiveXObject) { xmlDoc = new ActiveXObject("Microsoft.XMLHTTP"); } else { xmlDoc = new XMLHttpRequest(); } function getState() { var timestamp = new Date().getTime(); // 对路径参数做编码,避免特殊字符导致参数解析失败 var requestUrl = proxyName + "?path=" + encodeURIComponent("state.xml") + "&time=" + timestamp; // 改用异步请求,绑定状态变更回调 xmlDoc.open("GET", requestUrl, true); xmlDoc.onreadystatechange = function() { if (xmlDoc.readyState === 4 && xmlDoc.status === 200) { UpdateValues(); } } xmlDoc.send(null); timeOutID = setTimeout(getState, refreshTimeSec*1000); } </script>
PHP代码
<?php define('HOSTNAME', 'http://192.168.1.100/'); // 先校验path参数是否存在 if (!isset($_GET['path']) || empty($_GET['path'])) { http_response_code(400); exit("缺少path参数"); } $path = $_GET['path']; // 安全过滤,避免路径穿越漏洞,如果你需要子目录访问可以删掉这行 $path = str_replace(['..', '/', '\\'], '', $path); $url = HOSTNAME . $path; $session = curl_init($url); curl_setopt($session, CURLOPT_HEADER, false); curl_setopt($session, CURLOPT_RETURNTRANSFER, true); curl_setopt($session, CURLOPT_CONNECTTIMEOUT, 3); $xml = curl_exec($session); // 打印curl错误,方便定位请求问题 if(curl_errno($session)) { http_response_code(500); exit("请求错误: " . curl_error($session)); } curl_close($session); // 声明XML格式,避免JS解析异常 header("Content-Type: application/xml"); echo $xml; ?>
调试步骤
- 直接在浏览器地址栏访问
你的站点地址/proxy.php?path=state.xml,如果返回错误提示,按照提示对应排查参数/网络问题即可,正常会返回state.xml的内容。 - 如果直接访问正常,打开浏览器开发者工具的「网络」标签,查看JS发起的proxy.php请求的请求URL、Query String是否携带了正确的path参数。
内容的提问来源于stack exchange,提问作者Galgenstrick
相关产品推荐
相关产品推荐

