打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
在 Cache 中的url_rewrite和storeurl_rewrite实现自定义功能

我们之所以认为 Squid 功能强大,除了本身的功能强大外,还有一些可以扩展的地方,比如 url_rewrite, storeurl_rewrite 和 external_acl_type 这几个,相当爽,很方便扩展.以前我也用这个帮朋友做过几个小功能.下面分享一下我以前有关这些的资料.

我们使用 url_rewrite ,一定要深入的了解 url_rewrite 工作在什么地方,在 Squid 中,这种东西又叫重定向器,他可以引用 squid 的外部程序,它重写来自客户请求的URI .一定记的,是来源用户的 URL. 这时,客户其实在浏览器上的 url 是不会变化的.只是在回到源网站时,会对客户提交过来的 url 根据一些条件.来做改变.
在 storeurl_rewrite 中,和 url_rewrite 刚好相反.他是重写的来自源网站的 url ,是文件回源网站后取了文件,给取得的 url 修改成什么样子来存储.

以上的这些扩展,都工作在 Squid 内部的 ACL 之后,然后在回源网站之前, ACL 检查到要进行 redirect 的部分的内容后送给这个程序,在进行相应动作.

另外,在使用 url_rewrite 我们还可以修改响应,比如在输出 url 之前,给出 301,201 的响应时,浏览器就会得到跳转到新网站.比如 print 301:$url.

这个可以应用的地方非常多,比如来源网站和存的网站不一样,比如防盗链,比如图象网站中的 img1,img2,之类不同的域名合并成同一个域名,都是很容易实现的.

参考资料,可以看看 Squid中文权威指南 第11章 重定向器.

下面一个小例子,我做随机回源,应用的场景是.当我有一个网站,我有一些文件,是存在不同的 ip 上,没有一个地址可以取全.所以当一个请的请求过来时,我需要查询,这个 url 是存在那个 IP 上的.这时就能用到.

比如我有一个文件 php-oa.dat ,内容如下

1
2
3
4
5
6
7
http://1.1.1.1/example.iso
http://1.1.1.2/example2.iso
http://1.1.1.3/example3.iso

 我用来实现这个功能的 Squid 配置如下

1
2
3
4
5
6
acl phpoa_domain dstdomain www.php-oa.com
url_rewrite_program /usr/local/squid/bin/redirect.pl
url_rewrite_children 5
url_rewrite_host_header on
redirector_bypass off # 如果这个子扩展处理不过来,是否直接透传
url_rewrite_access allow phpoa_domain

 这是配置调用的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/perl
use strict;
use Digest::MD5;
$|=1;
my %url_to_ip;
my $md5 = Digest::MD5->new();
open my $file, "<php-oa.dat" or die "不能打开文件\n";
while(<$file>){
    chomp;
    # 存成 md5 文件内容会更加小,对长 url 会非常有用.
    if ( $_ =~ /^http:\/\/([^ ]+)\/([^ ]+)/ ){
        my $url_md5 = $md5->add($2)->hexdigest;
        $url_to_ip{$url_md5} = $1;
    }
}
close  $file;
while(<>){
    chomp;
    my ($url, $remote_host, $ident, $method, $urlgroup) = split;
    if ( $url =~ /^http:\/\/www.php-oa.com\/([^ ]+)/ ){
        my $url_md5 = $md5->add($1)->hexdigest;
        #使用 hash 来查询,性能会更加高
        print 'http://' . $url_to_ip{$url_md5}. '/' . $1 . "\n";
    }
    else {
        print "$url\n";
    }  
}

 注意,在这个地方, Squid 和这个定向器通信,是使用的管道,对定向器通信来讲,就是一个进和一个出的关系.Squid 每次提交给 redirect_proram的流格式为 URL IP/FQDN IDENT METHOD 中.当我们进行 Rewrite 处理时,也就是对这四个字段进行处理.

好了,上面处理完了,能正确的回源了.但是存出来,不能用有 ip 的 url 来存文件的路径吧,因为 url 是 squid 中的关系 key 来查找文件的.所以还得转换 ip 到域名,在转回来.下面我们这时就用到了 storeurl_rewrite .

在 Squid 中配置如下,来调用 storeurl_rewrite.

1
2
3
4
5
acl phpoa_ip url_regex ^http://[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/.*
storeurl_rewrite_program /usr/local/squid/bin/storeurl_phpoa.pl
storeurl_rewrite_children 30
storeurl_rewrite_concurrency 5
storeurl_access allow phpoa_ip

转换回来的程序

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl
use strict;
$|=1;
while (<>){
        if(/http:\/\/[^\/]+\/(\S.*)/){
                my $path = $1;
                print "0 http://www.php-oa.com/$path\n";             
        }
        else
        { print $_;}
}

 我上面的方便,都是参考用的例子,上在这个例子中,其实有个重大的 Squid 本身的 BUG 会影响他.需要多注意.现在我们使用了这些功能,我们怎么知道配置启动的子进程是不是合适.这个就要用到 squidclient ,这个可以很方便的查询到每个子进程被查到,我们要尽力保证前面的子进程处理完所有的请求,如果处理不完,就会堆到后面来.当我们发现大量的响应堆到后面的子进程时,就得考虑增加子进程了.
squidclient -p 80 mgr:url_rewrite
squidclient -p 80 mgr:storeurl_rewrite

会输出象下面这种来
# FD PID # Requests Flags Time Offset Request
1 10 35200 46 AB 0.902 0 http://…
2 11 35201 29 AB 0.401 0 http://…
3 12 35202 25 AB 1.009 1 cache_o…
4 14 35203 25 AB 0.555 0 http://…
5 15 35204 21 AB 0.222 0 http://…

使用 Squid 的 debug 的功能配置 debug_options 33,3 是可以见到重写的过程的

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
IIS7设置http跳转到https重定向的方法
squid做普通上网代理
nginx+squid+apache web架构
squid.conf部分说明
Linux上squid服务的配置
squid ACL控制列表,缓存
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服