【问题标题】:PHP AJAX proxy not returning body for POST requestsPHP AJAX 代理不返回 POST 请求的正文
【发布时间】:2026-01-23 18:55:01
【问题描述】:

我正在使用此 AJAX 代理来处理跨域 AJAX 请求:http://www.daniweb.com/code/snippet494.html。当我使用 GET 时效果很好。但是当我尝试使用 POST 时,body 似乎会丢失并且永远不会打印出来。我尝试打印日志并研究了代码,但我无法弄清楚出了什么问题。
谢谢,
艾萨克·沃勒

编辑:这是我正在使用的代码:

$.post("proxy.php?proxy_url=http://www.google.com", { postvar1: "hello", postvar2: "goodbye" },
  function(data){
    alert(data);
  },"text");

即使我制作了一个简单的表格并在没有输出结果的情况下对其进行测试。

【问题讨论】:

  • 什么是标题?那里有白色的字符吗?
  • @Itay Moav:我不明白你的问题——你能改写一下吗?

标签: php ajax http post proxy


【解决方案1】:

请在 您的 页面上发布失败的 html/javascript。

您引用的脚本需要查询字符串中的参数 $_GET 以及它仅传递的 post 中的可选参数。

除非您修改了该脚本,否则除非您在查询字符串中有信息,否则它将无法工作。

但是,您可以在同一个请求中同时获取和发布。

例如

var http = new XMLHttpRequest();
var url = "http://example.com/proxy.php?proxy_url=http://www.google.com";
var params="postvar1=hello&postvar2=goodbye";
http.open("post", url, true);
http.onreadystatechange = function() {
    alert("finished");
}
http.setRequestHeader("Content-type","application/x-www-form-urlencoded");
http.setRequestHeader("Content-length", params.length);
http.setRequestHeader("Connection", "close");
http.send(params);

注意使用的 url 包含查询字符串参数,并且使用带有参数的 post

或在 jQuery 中:

$.post("proxy.php?proxy_url=http://www.google.com", { postvar1: "hello", postvar2: "goodbye" },
  function(data){
    alert(data);
  },"text");

或在原型中:

 var http = new Ajax.Request("proxy.php?proxy_url=http://google.com", 
     { method: "post", 
       parameters: { postvar1:"hello", postvar2: "goodybe"}, 
       onSuccess: function(text) { alert(text);}
     });

【讨论】:

    【解决方案2】:

    不要相信我的话,但你不能做跨域 Ajax。 this article 中描述了一些变通方法,但不可能使用纯 ajax。

    【讨论】:

    • 我知道,我正在使用代理,这就是问题所在。
    【解决方案3】:

    试试这个:

    $.post("/proxy.php", {proxy_url: "http://www.google.com", postvar1: "hello", postvar2: "goodbye" },
      function(data){
        alert(data);
      },"text");
    

    当我尝试您的原始版本时,它返回错误 405,但上述方法有效。 JQUERY 或 proxy.php 都不喜欢混合 post 和 get 参数。

    编辑:

    我确实得到了一个页面,我可以在警告框中显示该页面,但它看起来与我期望的完全不同。我在一些带有发布联系表单的网站上尝试了相同的代码,并且它按预期工作。

    【讨论】:

      【解决方案4】:

      proxy.php 脚本可能有问题,所以它只在使用 GET 时返回一些内容。也许您从 $_GET 而不是从 php 脚本中的 $_REQUEST 获取请求数据?或者也许谷歌只是不回答 POST 请求。在这种情况下,您可能希望将 POST 转换为 GET。

      题外话:如果您只想代理几个受信任的域,请注意不要成为网络上所有内容的代理。

      【讨论】:

        【解决方案5】:

        改变这一行...

        $proxy_url = isset($_GET['proxy_url'])?$_GET['proxy_url']:false;
        

        到这里……

        $proxy_url = isset($_GET['proxy_url']) ? $_GET['proxy_url'] : (isset($_POST['proxy_url']) ? $_POST['proxy_url'] : false);
        

        这将解决服务器端问题。

        但是,当您通过 jQuery 发出请求时,您需要选择 GET 或 POST。目前,除了发布参数之外,您还通过查询字符串传递代理 URL 来使用两者的组合。这会失败,但很容易修复......

        $.post("/proxy.php", {proxy_url: "http://www.google.com", foo: "bar" }, function(dat) {
          alert(dat);
        });
        

        【讨论】:

          【解决方案6】:

          用 $_REQUEST 替换 PHP 文件中的所有 $_GET 变量。

          【讨论】: