Как понять право php-прокси (для решения кросс-домена / SOP) - PullRequest
0 голосов
/ 28 августа 2018

После двух дней исследований и некоторого спешного изучения php. Я, наконец, немного истощился и хочу как-то написать все, что я знаю, и попытаться спросить прямым и понятным способом. Поэтому, возможно, позже какой-нибудь новичок сможет найти здесь полезную информацию.

Вот как я понимаю php proxy, который предназначен для решения проблемы кросс-происхождения / кросс-домена.

  1. Вы не можете просто отправить ajax-запрос в другой домен (GET или POST), он будет заблокирован браузером из-за SOP (та же политика происхождения).

  2. Но, конечно, вы можете указать URL-адрес запроса прямо в браузере и получить необходимую информацию.

  3. Я понимаю, что прокси-php выглядит так: Это похоже на то, что прокси-php делает вещи за 2, он делает запрос к серверу, получает информацию, возвращает информацию вам. Таким образом, вы можете обработать информацию позже.

Я попробовал метод "GET", и он отлично работает:

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

in main.js:

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
})

довольно легко, верно? Однако я до сих пор не могу понять, почему человек поместил URL в «data» и создал для него «requrl». Но все в порядке. потому что это работает.

Затем я хотел попробовать метод «POST», в котором мне нужно POST-файл xml на целевой сервер, и сервер выполнит некоторые вычисления и вернет мне результат. Вот что я попробовал в proxy.php (использовал все, что я могу найти в переполнении стека):

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

и main.js:

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");
        }
    });
}

Код состояния для этого запроса ajax всегда 200 OK, но я никогда не получаю что-либо обратно. Потому что я думаю, что «200 OK» означает только то, что я успешно отправил запрос в proxy.php, но как proxy.php подключил целевой сервер или если в proxy.php есть какие-либо ошибки, я не знаю этого.

Итак, мои вопросы:

  1. если вы видите этот раздел кодов:

    $ postdata = http_build_query ( массив ( 'data' => $ _POST ['data'] ) );

Зачем мне нужен массив для передачи данных? То, что я хочу передать, это только XML-файл в строке. что будет очень легко сделать с обычным AJAX. (просто data: xml)

  1. Как узнать состояние соединения между proxy.php и реальным целевым сервером?

  2. Как правильно передать параметры? (Я попробовал POST в POSTMAN, все работает нормально. Для xml-файла, который нужно пропустить через POST, я просто выбрал "body" => "raw" и "XML (application / xml)" в POSTMAN, но я понятия не имею, как передать их с php / ajax на целевой сервер). Другими словами: что такое эквивалентные настройки в javascript / php, когда я успешно попробовал его в POSTMAN?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...