构建一个'简单'的php url代理

时间:2010-01-20 16:27:16

标签: php proxy php4 proxy-classes

我需要在我正在构建的Web应用程序中实现一个简单的PHP代理(基于Flash并且目标服务提供程序不允许编辑其crossdomain.xml文件)

任何php专家都可以就以下两个选项提供建议吗?另外,我认为,但我不确定,我还需要包含一些标题信息。

感谢您的反馈!

选项1

$url = $_GET['path'];
readfile($path);

选项2

 $content .= file_get_contents($_GET['path']);

 if ($content !== false) 
 {  

      echo($content);
 } 
 else 
 {  
      // there was an error
 }

2 个答案:

答案 0 :(得分:5)

首先,永远不要只包含基于用户输入的文件。想象一下如果有人像这样调用你的脚本会发生什么:

http://example.com/proxy.php?path=/etc/passwd

然后问题:你代理什么样的数据?如果有任何类型,那么你需要从内容中检测内容类型,然后传递它,以便接收端知道它得到了什么。如果可能的话,我建议使用类似于梨子的HTTP_Request2或类似的东西(参见:http://pear.php.net/package/HTTP_Request2)。如果您可以访问它,那么您可以执行以下操作:

// First validate that the request is to an actual web address
if(!preg_match("#^https?://#", $_GET['path']) {
        header("HTTP/1.1 404 Not found");
        echo "Content not found, bad URL!";
        exit();
}

// Make the request
$req = new HTTP_Request2($_GET['path']);
$response = $req->send();
// Output the content-type header and use the content-type of the original file
header("Content-type: " . $response->getHeader("Content-type"));
// And provide the file body
echo $response->getBody();

请注意,此代码尚未经过测试,这只是为了给您一个起点。

答案 1 :(得分:0)

这是使用curl的另一种解决方案 谁能发表评论?

$ch = curl_init();
$timeout = 30;
$userAgent = $_SERVER['HTTP_USER_AGENT'];
curl_setopt($ch, CURLOPT_URL, $_REQUEST['url']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);

$response = curl_exec($ch);    
if (curl_errno($ch)) {
    echo curl_error($ch);
} else {
curl_close($ch);
echo $response;
}