PHP:代理另一个网址
发布时间:2020-12-13 17:55:37 所属栏目:PHP教程 来源:网络整理
导读:我有一个mod_rewrite规则,它将任何子域请求发送到php脚本,该脚本应该将这些请求代理到另一个主机(内部代理,而不是302). 我很接近,因为我的脚本适用于网络浏览器,但curl似乎不喜欢它: curl: (56) Received problem 2 in the chunky parser 这是我的mod_rewri
我有一个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("rnrn",$data,2); $headers = explode("rn",$headers); foreach ($headers as $header) { header($header); } die($body); 任何理由为什么curl不喜欢这个但浏览器还可以呢? 编辑:似乎我不发送Transfer-Encoding:chunked标头,一切都很好(因为我代理了完整的请求,无法进行分块).这是一个后续问题:我可以充当真正的中间人并在我通过套接字获取数据时发送数据吗?
是的,您应该能够在获得数据时通过网络发送数据.但我怀疑你的问题可能源于持久的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 Client,并确保转发的请求足够接近您的需求. 无论您使用何种方法,我强烈建议您使用WireShark进行调试.然后,您可以转储2个http请求,然后使用类似Meld的内容来挑选差异. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |