|
|
|
| Вот я написал скрипт простенького прокси:
parce.php
<div style="position:relative;">
<center><form action="?" method="get">
<input type="Text" name="url" size="40" value="<?php echo $_GET['url']; ?>">
<input type="Submit" value=">>">
</form></center>
<hr></div><?
function parce($url)
{
$body = file_get_contents($url); // Считывание файла
preg_match('/\\b(?P<protocol>https?|ftp):\/\/(?P<domain>[-A-Z0-9.]+)(?P<file>\/[-A-Z0-9+&@#\/%=~_|!:,.;]*)?(?P<parameters>\\?[-A-Z0-9+&@#\/%=~_|!:,.;]*)?/i', $url, $path_details);
// Проверяем, верен ли введённый адрес
$filehost = $path_details[2];
$protocol = $path_details[1];
$body = str_replace($protocol."://".$filehost, '', $body);
$body = preg_replace( "#background[/s]*=[/s]*([']*[\"]*)(.*?)([']*[\"]*)#is" , " background=\\1viev.php?url=".$protocol."://".$filehost."/\\2\\3" , $body);
$body = preg_replace( "#src[/s]*=[/s]*([']*[\"]*)(.*?)([']*[\"]*)#is" , " src=\\1viev.php?url=".$protocol."://".$filehost."/\\2\\3" , $body);
$body = preg_replace( "#href[/s]*=[/s]*([']*[\"]*)(.*?)([']*[\"]*)#is" , " href=\\1parce.php?url=".$protocol."://".$filehost."/\\2\\3" , $body);
$body = str_replace("://", "linkezprotokol", $body);
$body = str_replace("//", "/", $body);
$body = str_replace("linkezprotokol", "://", $body);
echo $body;
}
if($_GET['url'])
{
parce($_GET['url']);
}
?>
|
viev.php
<?
function viev_open($url)
{
// Получение размера файла
$filepath = trim($url);
// Делим путь к файлу на хост и "хвост" (для сокетов)
preg_match('/\\b(?P<protocol>https?|ftp):\/\/(?P<domain>[-A-Z0-9.]+)(?P<file>\/[-A-Z0-9+&@#\/%=~_|!:,.;]*)?(?P<parameters>\\?[-A-Z0-9+&@#\/%=~_|!:,.;]*)?/i', $filepath, $path_details);
// Проверяем, верен ли введённый адрес
if(isset($path_details[2]) && !empty($path_details[2]))
{
$filehost = $path_details[2];
}
else
{
echo "WRONG LINK!";
exit;
}
// Если "хвост" пуст, заполняем пустоту слешем, что бы не сглючили сокеты
if(isset($path_details[3]) && !empty($path_details[3]))
{
$filepath = $path_details[3];
}
else
{
$filepath = "/";
}
// Подключаемся к файлу через сокеты
$getfile = fsockopen($filehost, 80, $errno, $errstr, 30) or die("Can't connect ot the sever");
// Добавляем в буффер путь к файлу на сервере и сам хост
fputs($getfile, "HEAD $filepath HTTP/1.0\nHOST: $filehost\n\n");
// Объявляенм буффер-переменную для заголовков
$temp_headers = "";
// Читаем заголовки по 4 кб, пока не дойдём до конца сокет-файла
while(!feof($getfile)) $temp_headers .= fgets($getfile, 4096);
// Ищем в полученных заголовках Content-Length, если находим,читаем его значение
if(ereg("Content-Length: ([0-9]+)", $temp_headers, $matched_array))
{
$filesize = $matched_array[1];
}
if(ereg("Content-Type: (.*)", $temp_headers, $matched_array))
{
$filtype = $matched_array[1];
}
header('Content-Type: '.$filtype); // Отправляем тип файла.
header('Content-Length: '.$filesize); // Отправляем его размер.
echo file_get_contents($url); // Считывание файла
exit();
}
if($_GET['url'])
{
viev_open($_GET['url']);
}
|
Есть сложности:
1. Если в файле есть сслыка типа "../index.php", то она не открывается
2. Шота viev.php не отображает картинки
3. Если открыть папку на любом сервере, типа http://localhost/chat/, то пути для кртинок не учитівають её. Те заместь правильного абсолютного путя http://localhost/chat/img.gif скрипт пытается загрузить картинку http://localhost/img.gif
И теоретические вопросы:
1. Как сделать чтоб автоматически распознавались ссылки на файлы?
Да и вобще может кто посоветует, как лучше его сделать и какие в нём есть ошибки и недостатки...
Благодарен за любую помощь | |
|
|