因为这么一个想法,我陆陆续续的把squid很多功能都理了一遍,今天终于打算写个不完美的终结篇。而就在写这个终结篇的同时,公司里也已经开始把这批别扭的客户改往nginx平台加速了。
总结这批客户的跳转要求,其实格式都比较统一,大抵就是*.abc.com(.cn)坏了就转到abc.cdn.21vokglb.cn。在3月24日的博文最后,已经有了一个思路——既然无法执行php的header(Location)和strstr(%U),那么就干脆在squid的src里对%U进行操作好了。
squid-src/errorpage.c中关于%U的注释是:
U - URL without password
相关语句是:
c
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