标题很引人吧。其实是我在查找squid的rewrite资料时,看到的一篇文章。原作者突发奇想,准备让公司的同事们上网时,看到的所有图片全都倒过来180°。嘿嘿,小样,还不拧断你们脖子~~
当然这么个大计划,单靠squid还是不行的,得后台配合一下web服务器才行。
原理是这样的:squid每接到一个请求,首先判断后缀名是不是图片类型,如果是,下载到web服务器目录,然后调用程序颠倒图片,拷贝去另一个发布路径下。最后把新的路径返回给squid,交给浏览器去看。
假设下载目录是/revimg,发布目录是/revimg/out,那么apache里配置如下vhost:
ServerName revimg.soulogic.com
DocumentRoot /revimg/out
好了,其他准备完成。进入squid部分:
squid官方并没有转向的设定,不过他允许甚至推荐了一些转向外挂(好吧,说好听些,第三方插件)。只需要很简单的在squid.conf里启用url_rewrite_program(也叫redirect_program)就可以了:
url_rewrite_program /etc/squid/redirect.php(常见的是pl、py,当然也可以是squirm、squidGuard等软件,其实只要是squid属主可执行文件,parse都能通过)
根据需要,还有相关的children、access、host配置。 下面是原作者提供的php代码。很赞,可惜还没看懂,慢慢品味:
#!/usr/bin/php
<?PHP
chdir("/revimg");
$sServer = "revimg.soulogic.com";
while ($sContent = fgets(STDIN) ) {
$sContent = trim($sContent);
if (empty($sContent)) {
continue;
}
$aArg = explode(" ", $sContent, 5);
$sURL = $aArg[0];
if ($aArg[3] != "GET") {
fwrite(STDOUT, $sURL."n");
continue;
}
$aURL = parse_url($sURL);
$aURL += array("scheme" => "", "host" => "", "path" => "");
if ($aURL["scheme"] != "http"
|| $aURL["host"] == $sServer
|| !preg_match("/^[0-9a-z\-]+(\.[0-9a-z\-]+)+(:[0-9]{2,5})?$/i", $aURL["host"])
|| !preg_match("/\.(jpg|jpeg|png|gif)$/i", $aURL["path"])
) {
fwrite(STDOUT, $sURL."n");
continue;
}
// 检测通过,处理图片
$sHash = md5($sURL);
$sDir = substr($sHash, 0, 2)."/".substr($sHash, 2, 2);
$sFile = $sDir."/".substr($sHash, 4);
$sFileOut = "out/".$sFile;
if (!file_exists($sDir)) {
mkdir($sDir, 0777, TRUE);
mkdir("out/".$sDir, 0777, TRUE);
chmod("out", 0777);
chmod("out/".substr($sHash, 0, 2), 0777);
chmod("out/".$sDir, 0777);
}
if (!file_exists($sFile)) {
$sCmd = "wget -qc ".escapeshellarg($sURL)." -O ".$sFile;
exec($sCmd);
}
if (!file_exists($sFileOut)) {
$sCmd = "convert ".$sFile." -flip -quality 80 ".$sFileOut;
exec($sCmd);
chmod($sFileOut, 0666);
}
$sURL = "<a href="http://"/">http://"</a>.$sServer."/".$sFile;
fwrite(STDOUT, $sURL."n");
}
?>
原作者说:squid在重定向处理是采用的标准输入输出方式,所以测试的时候只需要cat test.txt|/etc/squid/redirector.php就可以了。 这个东东还能进一步优化。因为图片在浏览器本地也有缓存的,如果之前同事们已经上过,怎么办?还得改写Expires。