Squid proxy modifiye html içerik hizmet değil

2 Cevap php

Ben web sayfası istekleri sayfa içeriğini değiştirmek için kalamar kullanmaya çalışıyorum. Ben sayfalarında görüntüleri çevirmek için nasıl talimatlar gösterdi upside-down-ternet öğretici izledi.

Ben sayfanın gerçek html değiştirmek gerekir. Ben öğretici olarak aynı şeyi yapmaya çalışıyorum, ancak bunun yerine görüntü düzenleme ben html sayfayı düzenlemek için çalışıyorum. Aşağıda bunu yapmak için denemek için kullanıyorum bir php betik.

Tüm jpg görüntüleri saygısız olsun, ama sayfadaki içeriğin düzenlenebilir almaz. Yazılı Düzenlenen index.html dosyaları Düzenlenen içeriği, ancak kullanıcıların aldığı sayfaları Düzenlenen içeriği yok.

#!/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 Cevap

Dansguardian bir göz atın; Bu anında içeriğini değiştirmek için PCRE'yi kullanır: link (son 2 konularda bakmak)

Sorunun onun nedeni emin, ancak kod ile yanlış oldukça çok şey var değil.

Yönlendirici çalışan birden çok örneği varsa orijinal (Perl) kodu hala kırılabilir unutmayın - Sen Microtime'da dayalı ayrı istekleri - Eğer trafiğin nispeten düşük hacimli varsa bu sadece güvenilir çalışacaktır.

Bu listeyi eşleşen dosyalar için çalışacak - - Sen dosya uzantısına göre içerik türünü belirlemek için denedim ama listesi metin / html olmalı eşleşmiyor şeyleri takip etmez - gerçekten kontrol etmelisiniz mimetype origin sunucusu tarafından döndürülen.

Siz kodda hiçbir hata denetimi / hata ayıklama var - Eğer kolayca yazabilirsiniz bir hata akışı yok rağmen, size syslog'un, bir dosyaya yazma hataları, ya da bir e-posta ateş eğer fopen / fread deyimleri işe yaramazsa, ya da kaydedilen dosya bir. html uzantısı yoksa.

C.