PHP Curl 和 headers 问题

标签 php http curl content-type httpresponse

我之前曾问过这个问题,但又遇到了问题,但无法解决。我有一个内部代理服务器和一个内容服务器。代理服务器上的代码是这样的。 (有些评论可能是错误的,但留下来表达我的理解):

<?php
session_start();
$data_server_url = "http://my_data_server_url/";
$i_var_prefix="i_var_";

$process_headers_separately=0;
//$process_headers_separately=1;
// WARNING! Has problems with GZIPPED DATA!
// AVOID/REMOVE OPTION ALLTOGETHER
// (Set to 1 if you want to catch received headers
// and send explicit headers to clients)
//-----------------------------------------

// Other important request dependent 'SERVER' variables.
if(isset($_SERVER['HTTPS']))
{ $_POST["${i_var_prefix}_HTTPS"]=$_SERVER['HTTPS']; };

if(isset($_SERVER['REMOTE_ADDR']))
{ $_POST["${i_var_prefix}_REMOTE_ADDR"]=$_SERVER['REMOTE_ADDR']; };

$request_uri="";
if(isset($_SERVER['REQUEST_URI'])) { $request_uri = $_SERVER['REQUEST_URI']; };
$curl_url="${data_server_url}${request_uri}";

$field_array= array(
      'Accept' => 'HTTP_ACCEPT',
      'Accept-Charset' => 'HTTP_ACCEPT_CHARSET',
      'Accept-Encoding' => 'HTTP_ACCEPT_ENCODING',
      'Accept-Language' => 'HTTP_ACCEPT_LANGUAGE',
      'Connection' => 'HTTP_CONNECTION',
      'Host' => 'HTTP_HOST',
      'Referer' => 'HTTP_REFERER',
      'User-Agent' => 'HTTP_USER_AGENT'
      );

$curl_request_headers=array();

foreach ($field_array as $key => $value) {
   if(isset($_SERVER["$value"])) {
      $server_value=$_SERVER["$value"];
      $curl_request_headers[]="$key: $server_value";
   }
};
//------
session_write_close();

//Open connection
$curl_handle = curl_init();
curl_setopt($curl_handle,CURLOPT_COOKIE,session_name()."=".session_id().";");
//Set the url, number of POST vars, POST data
curl_setopt($curl_handle, CURLOPT_URL, $curl_url);
curl_setopt($curl_handle, CURLOPT_POST, count($_POST));
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, $_POST);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handle, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($curl_handle, CURLOPT_HEADER, $process_headers_separately);
curl_setopt($curl_handle, CURLOPT_HTTPHEADER, $curl_request_headers);
curl_setopt($curl_handle, CURLOPT_ENCODING, "identity");


//Execute post
$result = curl_exec($curl_handle);

//Close connection
curl_close($curl_handle);

if ($process_headers_separately) {
   list($headers,$content)=explode("\r\n\r\n",$result,2);
   foreach (explode("\r\n",$headers) as $hdr) {
      header($hdr);
   }
   echo $content;
} else {
   echo $result;
}    
?>

问题1:在当前代码中,即使data_server返回的Content-Type是text/plain,客户端看到的content-type也是text/html。 例如,参见http://sarcastic-quotes.com/robots.txt该请求转到上面的文件。我已经检查过数据服务器实际上以文本/纯文本形式返回内容类型。但通过代理,客户端在响应 header 中看到的内容类型为 text/html。

问题 2:注意变量 process_headers_separately 的使用。如果我将其设置为 1,则浏览器会尝试下载 gzip 文件而不是显示内容(无论数据服务器返回什么内容类型)。因此,该代码流中存在一些逻辑错误。

我只是希望上面的代码作为内部代理工作,无缝地充当我的数据服务器和客户端之间的桥梁。任何想法将不胜感激,我真的很困惑如何正确处理上面的标题。

问候, 日本


当process_headers_separately=1(浏览器下载文件而不是显示)时,我找到了问题的原因。但这太奇怪了,我无法解决。问题:如果我取消注释行 if(isset($_SERVER['REMOTE_ADDR'])) { $_POST["${i_var_prefix}_REMOTE_ADDR"]=$_SERVER['REMOTE_ADDR']; }; 然后一切就开始正常了!奇怪的!

就像尼尔建议的那样,这一定是一些疯狂的空白问题。

无论如何,试图解决这个问题 - 由于这个疯狂的错误,我已经花了 3 天(之前 2 天,现在 1 天):(。感谢 Neil 和 RF 帮助我解决这个问题。

最佳答案

这一切看起来都很干净。我能看到的唯一差异是某些服务器仅使用 \n 分隔 header ,而不是 \r\n。但这可能不是问题所在。

您可以尝试将 var_export(explode("\r\n",$headers),true) 写入文件并查看结果吗?

关于您的 gzip 问题,请确保关闭 ?> 后没有尾随空格,或者更安全,将 echo $result 更改为 die($result )。显然,如果您不传递 CURL 响应的 header ,Apache 将自行构建,因此您将需要 CURLOPT_HEADER 标志。

CURL 是否会为您解压缩响应?如果是这样,您可能需要干预 Content-EncodingContent-Length 响应 header 。

n.

关于PHP Curl 和 headers 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4507698/

相关文章:

php - 在公共(public)目录中加载 Blade 模板

java - 在 httpclient : java 中编写的 curl 等效代码

c++ - QT 上传(PUT)文件

php - cURL 请求挂起浏览器并继续在 Cpanel 上等待

javascript - 为什么 Javascript 和 PHP 中的 LShift (<<) 不一样?

php - 以下哪一个 PHP 数组结构会使用更少的内存?

php - 如何在每个循环中增加 Jquery 变量

.htaccess - 如何使用 HTTP 禁用 HSTS header ?

php - 如何通过 HTTP 下载 URL 中包含 unicode 字母的图像?

ruby - 为什么我必须对 Net::HTTP 请求的安全字符进行 URI.encode?