PHP: прокси другой URL - PullRequest
       11

PHP: прокси другой URL

7 голосов
/ 04 марта 2010

У меня есть правило mod_rewrite, которое отправляет любые запросы субдоменов в скрипт php, который должен передавать эти запросы на другой хост (внутренний прокси, а не 302).

Я близок к тому, что мой скрипт работает с веб-браузерами, но curl кажется не таким:

curl: (56) Received problem 2 in the chunky parser

Вот мой mod_rewrite:

RewriteCond %{HTTP_HOST} ^(.*)\.example\.com$
RewriteRule ^.*$ %{DOCUMENT_ROOT}/proxy.php?__path=%1 [QSA,L]

И мой proxy.php

<?php

$name = $_GET['__path'];
unset($_GET['__path']);
$path = $_SERVER['REQUEST_URI'];

$url = "http://$name.internal.example.com$path";
$ch = curl_init($url);
$headers = array();
foreach (apache_request_headers() as $key => $value) {
    $headers[] = "$key: $value";
}
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $_SERVER['REQUEST_METHOD']);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($_POST));
curl_setopt($ch, CURLOPT_HEADER, TRUE);  

$data = curl_exec($ch);

list($headers, $body) = explode("\r\n\r\n", $data, 2);
$headers = explode("\r\n", $headers);
foreach ($headers as $header) {
    header($header);
}
die($body);

Любая причина, почему curl не нравится это, но браузеры в порядке с этим?

РЕДАКТИРОВАТЬ: Кажется, если я не отправляю заголовок Transfer-Encoding: chunked, все в порядке (так как я передаю полный запрос, чанкинг невозможен). Итак, следующий вопрос: могу ли я выступить в роли настоящего посредника и отправлять данные по мере их поступления через сокет?

1 Ответ

3 голосов
/ 04 марта 2010

Да, вы должны иметь возможность отправлять данные по сети по мере их поступления. Но я подозреваю, что ваша проблема может быть связана с постоянными http-соединениями. HTTP 1.0 разорвет соединение после запроса, в вашем коде вы создаете новый дескриптор CURL для каждого запроса, который больше похож на HTTP / 1.0 вместо HTTP / 1.1

по умолчанию
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);

У вас все еще могут быть проблемы с прикладным уровнем, поскольку CURL не предназначен для работы в качестве прокси-сервера. Другой подход - изменить существующий PHP HTTP-клиент и убедиться, что перенаправленные запросы достаточно близки для ваших нужд.

Независимо от того, какой подход вы используете, я настоятельно рекомендую использовать WireShark для отладки. Затем вы можете сбросить 2 http-запроса и затем использовать что-то вроде Meld , чтобы выявить различия.

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