Как отправлять отправлять запросы через мой сервер?

Суть такая: у меня есть мобильное приложение, которое отправляет запросы на основной сервер и получает оттуда ответы.
Я хочу отправлять запросы не напрямую, а через еще один дополнительный сервер.
На дополнительном сервере написала скрипт:
<?php
$curl = curl_init();

$url = substr($_SERVER['REQUEST_URI'], 1);

curl_setopt($curl, CURLOPT_URL,  $url);
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HTTPHEADER, getallheaders());

if($_SERVER['REQUEST_METHOD'] == 'POST'){
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $_POST);
}

$res = curl_exec($curl);

$header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$headers = substr($res, 0, $header_size);
$body = substr($res, $header_size);

$out = fopen('php://output', 'w');
fputs($out, $headers . PHP_EOL . PHP_EOL . $body);
fclose($out);
curl_close($curl);

die;

Но в таком случае при отправке ответа приложению, мой дополнительный сервер отправлял свои какие-то заголовки, а то что я кидала в php://output всё считал как тело запроса. Вот так:
8f11b8eddc5445168b9e024ab8e087ea.png

Я попробовала сделать так:
...
$header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$headers = substr($res, 0, $header_size);
$body = substr($res, $header_size);

$headers = explode(PHP_EOL, trim($headers));

foreach ($headers as $header) {
    header($header);
}

$out = fopen('php://output', 'w');
fputs($out, $body);
fclose($out);
...

Но так вообще не работает. Пишет, что сервер неожиданно разорвал соединение.
Как реализовать, то, что мне надо?
  • Вопрос задан
  • 323 просмотра
Пригласить эксперта
Ответы на вопрос 1
kovalenko_jul_s
@kovalenko_jul_s Автор вопроса
$headers = explode(PHP_EOL, trim($headers));
ошибка была здесь.
надо не PHP_EOL, а "\r\n";

и еще здесь curl_setopt($curl, CURLOPT_HTTPHEADER, getallheaders());
getallheaders() возвращает ассоциативный массив. а необходимо массив вида
['Content-type: text/plain', 'Content-length: 100']
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы