PHP: Vekil başka url

1 Cevap php

Ben bir php komut dosyası için herhangi bir alt alan yollayacak bir mod_rewrite kural var ki gerektiği vekil başka bir host (iç proxy değil, 302) için bu istekleri.

Benim komut dosyası web tarayıcıları ile çalışır olarak, yakın değilim, ama kıvırmak gibi değil gibi görünüyor:

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

İşte benim mod_rewrite olduğunu:

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

Ve 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);

Kıvırmak tarayıcılar ama bu sevmiyor neden herhangi bir nedenle onunla Tamam?

(Ben tam isteği vekalet ediyorum beri parçalama, mümkün değildir) her şeyi Tamam Transfer-Encoding: chunked başlık göndermek yoksa EDIT: görünüyor. Yani takip soru: Ben gerçek bir aracı olarak hareket ve ben soket üzerine almak gibi veri gönderebilir miyim?

1 Cevap

Bunu almak gibi Evet, ağ üzerinden gönderme yapabilen verisi olmalıdır. Ama senin sorunun kalıcı http bağlantıları kaynaklanıyor olabilir şüpheli. HTTP 1.0 kodunuzu daha HTTP/1.0 gibi yerine varsayılan HTTP/1.1 biridir her istek için yeni bir CURL tanıtıcı oluştururken, istek sonra bağlantıyı kıracak

curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);

CURL böyle bir vekil olarak hareket etmek anlamına değil çünkü hala uygulama katmanı ile ilgili sorunlar olabilir. Bir diğer yaklaşım mevcut PHP HTTP Client değiştirmek ve iletilen istekleri ihtiyaçlarınız için yeterince yakın olduğundan emin olacaktır.

Olursa olsun kullanmak ne yaklaşım, ben çok hata ayıklama için Wireshark kullanmanızı öneririz. Daha sonra 2 http isteklerini dökümü ve ardından Meld farklılıkları ortaya çıkarmak gibi bir şey kullanabilirsiniz.