有关squid源站故障转向的问题

发布时间:2019-09-16编辑:脚本学堂
客户的跳转要求,其实格式都比较统一,大抵就是*.abc.com(.cn)坏了就转到abc.cdn.jbxue.com。在之前的博文最后,已经有了一个思路——既然无法执行php的header(Location)和strstr(%U),那么就干脆在squid的src里对%U进行操作好了。

有关squid源站故障转向的问题,有需要的朋友可以参考下。

客户的跳转要求,其实格式都比较统一,大抵就是*.abc.com(.cn)坏了就转到abc.cdn.jb200.com。
在之前的博文最后,已经有了一个思路——既然无法执行php的header(Location)和strstr(%U),那么就干脆在squid的src里对%U进行操作好了。

squid-src/errorpage.c中关于%U的注释是:
U - URL without password

相关语句是:
p = r ? urlCanonicalClean(r) : err->url ? err->url : "[no URL]";

只要把url按”.”分割,然后取出第二个域abc,就可以在html代码中给它加上跳转后的url了——这一步也能在src里完成,不过以后不好修改了,虽然现在这样子的定制性也强不到哪去~ 从大二到现在无数年了,c已经属于忘到冥王星外的东东,于是一个一个的翻c的字符串函数,从strstr、strchr、strcat、strtok、strsep到最后终于发现sscanf。只要在src/errorpage.c的588行下加这么一句话就可以了:
 

复制代码 代码如下:
587     case 'U':
588         p = r ? urlCanonicalClean(r) : err->url ? err->url : "[no URL]";
589+      sscanf(p,"%*[^.].%[^.]",p);
590         break;

然后编译安装,一路通过没有问题~~启动squid服务,测试一下%U吧~ 先把ERR_ACCESS_DENIED内容修改如下:
 

复制代码 代码如下:
<HTML>
<BODY>
<head>
<META HTTP-EQUIV="refresh"   Content="0;URL=http://%U.cdn.jb200.com/index.htm">
</head>
</HTML>

然后在squid.conf中增加对自己本机的访问控制如下:
 

复制代码 代码如下:
acl test src 222.62.104.189/255.255.255.255
http_access deny rao

squid -k reconfigure生效,访问一下www.xyfunds.com.cn,果然跳转到xyfunds.cdn.jb200.com/index.htm啦~~ 完毕。 虽然最终还是没能达到任意定义跳转url的目标,不过就本身的出发点来说,还是完成了需求。这也是我N年来第一次重新看C,也是第一次修改squid代码,虽然只加了一句。