Прокси Squid не обслуживает измененный контент html - PullRequest
1 голос
/ 24 марта 2010

Я пытаюсь использовать squid для изменения содержимого запросов веб-страниц. Я следовал учебному пособию Перевернутый тернет , в котором приведены инструкции, как переворачивать изображения на страницах.

Мне нужно изменить фактический HTML-код страницы. Я пытался сделать то же самое, что и в руководстве, но вместо того, чтобы редактировать изображение, я пытаюсь редактировать HTML-страницу. Ниже приведен скрипт php, который я использую, чтобы попытаться это сделать.

Все изображения JPG переворачиваются, но содержимое на странице не редактируется. Написанные отредактированные файлы index.html содержат отредактированный контент, но страницы, которые получают пользователи, не содержат отредактированный контент.

#!/usr/bin/php
<?php
$temp = array();
while ( $input = fgets(STDIN) ) {
    $micro_time = microtime();

    // Split the output (space delimited) from squid into an array.
    $temp = split(' ', $input);

    //Flip jpg images, this works correctly
    if (preg_match("/.*\.jpg/i", $temp[0])) {
        system("/usr/bin/wget -q -O /var/www/cache/$micro_time.jpg ". $temp[0]);
        system("/usr/bin/mogrify -flip /var/www/cache/$micro_time.jpg");
        echo "http://127.0.0.1/cache/$micro_time.jpg\n";
    }

    //Don't edit files that are obviously not html. $temp[0] contains url of file to get
    elseif (preg_match("/(jpg|png|gif|css|js|\(|\))/i", $temp[0], $matches)) {
        echo $input;
    }   

    //Otherwise, could be html (e.g. `wget http://www.google.com` downloads index.html)
    else{ 
        $time = time() . microtime();       //For unique directory names
        $time = preg_replace("/ /", "", $time); //Simplify things by removing the spaces
        mkdir("/var/www/cache/". $time);    //Create unique folder
        system("/usr/bin/wget -q --directory-prefix=\"/var/www/cache/$time/\" ". $temp[0]);
        $filename = system("ls /var/www/cache/$time/");     //Get filename of downloaded file

        //File is html, edit the content (this does not work)
        if(preg_match("/.*\.html/", $filename)){

            //Get the html file contents  
            $contentfh = fopen("/var/www/cache/$time/". $filename, 'r');
            $content = fread($contentfh, filesize("/var/www/cache/$time/". $filename));
            fclose($contentfh);

            //Edit the html file contents
            $content = preg_replace("/<\/body>/i", "<!-- content served by proxy --></body>", $content);

            //Write the edited file
            $contentfh = fopen("/var/www/cache/$time/". $filename, 'w');
            fwrite($contentfh, $content);
            fclose($contentfh);

            //Return the edited page
            echo "http://127.0.0.1/cache/$time/$filename\n";
        }               
        //Otherwise file is not html, don't edit
        else{
            echo $input;
        }
    }
}
?>

Ответы [ 2 ]

0 голосов
/ 24 марта 2010

Не уверен, является ли это причиной вашей проблемы, но с кодом довольно много ошибок.

Вы разделяете запросы на основе микровремени - это будет работать надежно, только если у вас относительно небольшие объемы трафика - обратите внимание, что исходный (perl) код все еще может сломаться, если работает более одного экземпляра перенаправителя.

Вы пытались определить тип контента на основе расширения файла - это будет работать для файлов, которые соответствуют списку - но это не означает, что материал, который не соответствует списку, должен быть text / html - на самом деле Вы должны проверить MIME-тип, возвращаемый сервером происхождения.

У вас нет ошибок / отладки в коде - хотя у вас нет потока ошибок, в который вы легко можете записать, вы можете записать ошибки в файл, в системный журнал или запустить электронную почту, если операторы fopen / fread не работают, или если сохраненный файл не имеет расширения .html.

С

0 голосов
/ 24 марта 2010

Посмотрите на Dansguardian; он использует PCRE для изменения содержимого на лету: ссылка (посмотрите последние 2 темы)

...