Javascript 如何理解php代理权(解决跨域/SOP问题)

Javascript 如何理解php代理权(解决跨域/SOP问题),javascript,php,ajax,proxy,Javascript,Php,Ajax,Proxy,经过两天的研究和对php的快速学习。我终于有点累了,想把我知道的东西都写下来,试着用一种严谨、简单的方式提问。所以也许以后一些初学者可以在这里找到一些有用的信息 下面是我对php代理的理解,它旨在解决跨源/跨域问题 您不能只将ajax请求发送到另一个域(GET或POST),它将由于SOP(同源策略)而被浏览器阻止 当然,您可以将请求的url直接提供给浏览器,并获取所需的信息 我对代理php的理解是这样的:就像代理php在2中为您做的事情,它向服务器发出请求,获取信息,将信息返回给您。这样你以后就

经过两天的研究和对php的快速学习。我终于有点累了,想把我知道的东西都写下来,试着用一种严谨、简单的方式提问。所以也许以后一些初学者可以在这里找到一些有用的信息

下面是我对php代理的理解,它旨在解决跨源/跨域问题

  • 您不能只将ajax请求发送到另一个域(GET或POST),它将由于SOP(同源策略)而被浏览器阻止

  • 当然,您可以将请求的url直接提供给浏览器,并获取所需的信息

  • 我对代理php的理解是这样的:就像代理php在2中为您做的事情,它向服务器发出请求,获取信息,将信息返回给您。这样你以后就可以处理这些信息了

  • 我尝试过“获取”方法,效果很好:

    proxy.php
    中:

    <?php
    $nix="";
    $type=$_GET['requrl'];
    if ($_GET['requrl'] != $nix) {
        $file = file_get_contents($_GET['requrl']);
    }
    elseif ($_POST['requrl'] != $nix) {
        $file = file_get_contents($_POST['requrl'], false, $_POST['data']);
    }
    else {
        $file = "false type";
    }
    echo $file;
    ?>
    
    很简单吧?然而,我仍然无法理解为什么人类将url放在“数据”中,并为其创建一个“requrl”。但是没关系。因为它有效

    然后我想尝试“POST”方法,在该方法中,我需要将一个xml文件发布到目标服务器,服务器将进行一些计算并返回结果。这是我在
    proxy.php
    中尝试的(使用了我在堆栈溢出中找到的所有内容):

    此ajax请求的状态代码始终为200 OK,但我从未收到任何回复。因为我认为“200 OK”只意味着我成功地将请求发送到了proxy.php,但是proxy.php是如何连接到目标服务器的,或者proxy.php中是否有任何错误,我不知道。

    所以我的问题是:

  • 如果您看到本节代码:

    $postdata=http\u构建\u查询( 排列( “数据”=>$\u POST[“数据”] ) );

  • 为什么我需要一个数组来传递数据?我只想传递一个字符串形式的xml文件。使用普通的ajax很容易做到这一点。(只需
    数据:xml

  • 如何知道proxy.php与实际目标服务器之间的连接状态?

  • 如何正确传递参数?(我在POSTMAN中试过这篇文章,一切都很好。对于需要通过POST传递的xml文件,我在POSTMAN中选择了“body”=>“raw”和“xml(application/xml)”,但我不知道如何使用php/ajax将它们传递到目标服务器)。换句话说:当我在POSTMAN中成功尝试javascript/php时,javascript/php中的等效设置是什么?


  • 尝试使用cURL而不是使用file\u get\u内容。像Guzzle这样的图书馆可能会使它更简单,也希望你能给我们提供建议。在搜索过程中我看到了很多。但是因为我对php几乎一无所知,所以我只尝试了无旋度的解决方案。对于php初学者来说,这会很难吗?找到教程和阅读文档应该不难
    var url = 'https://www.example.com/example?'
    url = encodeURI(url);
    $.ajax({
    type: 'GET',
    url: 'proxy.php',
    data: {requrl: url}
    }).done(function(res) {
         // handle the response
    })
    
    <?php
    $nix="";
    $type=$_GET['requrl'];
    
    if ($_GET['requrl'] != $nix) {
        $file = file_get_contents($_GET['requrl']);
    }
    elseif ($_POST['requrl'] != $nix) {
        $postdata = http_build_query(
            array(
                'data' => $_POST['data']
            )
        );
        $opts = array('http' =>
            array(
                'method' => 'POST',
                'header' => 'Content-type: application/xml',
                'content' => $_POST['data']
            )
        );
        $context = stream_context_create($opts);
        $file = file_get_contents($_POST['requrl'], false, $context);
    }
    else {
        $file = "false type";
    }
    echo $file;
    ?>
    
    function sendPOSTRequest(xml) {
        var url = 'https://www.example.com/example?';
        url = encodeURI(url);
    
        $.ajax({
            type: "POST",
            url: "proxy.php",
            data: {
                requrl: url,
                data: xml
            },
            success: function (response) {
                console.log('POST: ', response);
            },
            error: function (jqXHR, textStatus, errorThrown) {
                console.log("error: ", textStatus, errorThrown);
                alert("POST failed");
            }
        });
    }