Squid代理不提供修改后的html内容

时间:2010-03-24 08:29:48

标签: php html squid

我正在尝试使用squid来修改网页请求的页面内容。我按照upside-down-ternet教程进行了操作,该教程显示了如何在页面上翻转图像的说明。

我需要更改页面的实际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 :(得分:0)

看看Dansguardian;它使用PCRE动态修改内容:link(查看最后2个主题)

答案 1 :(得分:0)

不确定是否是问题的原因,但代码存在很多错误。

您根据microtime分离请求 - 只有在流量相对较低的情况下才能可靠地工作 - 请注意,如果有多个重定向器实例正在运行,原始(perl)代码可能仍会中断。

您已尝试根据文件扩展名识别内容类型 - 这适用于与列表匹配的文件 - 但它不会跟随与列表不匹配的内容必须是text / html - 真的你应该检查源服务器返回的mimetype。

您在代码中没有错误检查/调试 - 虽然您没有可以轻松写入的错误流,但您可以将错误写入文件,syslog或发送电子邮件,如果fopen / fread语句不起作用,或者存储的文件没有.html扩展名。

下进行。