You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
?>

调试步骤

  1. 直接在浏览器地址栏访问你的站点地址/proxy.php?path=state.xml,如果返回错误提示,按照提示对应排查参数/网络问题即可,正常会返回state.xml的内容。
  2. 如果直接访问正常,打开浏览器开发者工具的「网络」标签,查看JS发起的proxy.php请求的请求URL、Query String是否携带了正确的path参数。

内容的提问来源于stack exchange,提问作者Galgenstrick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 11:15:07