storeurl_rewrite是squid非常有用的功能,对同一个目标文件的访问,产生的url不一定是相同的,而squid是根据url进行缓存的,所以就会有大量的冗余的缓存,浪费了空间和squid的处理能力。squid可以调用外部程序进行storeurl_rewrite,其中jesred非常强大,它是用C写的,执行速度高于用shell完成的同样功能的脚本。
我使用jesred进行storeurl重写的时候遇到了一些问题,而这种小程序的说明文档又很少,所以只好自己阅读了一下jesred的代码,发现了下面的问题。
squid2.7使用向rewrite使用的stdout为
http://xxx.test.com:
$squid_listening_port
/p_w_picpaths/course_simple.png $client_ip/- - GET -
myip=$server_ip myport=$squid_listening_port
而jesred处理的只能是
http://xxx.test.com:
$squid_listening_port
/p_w_picpaths/course_simple.png $client_ip/- - GET
这部分
#这里
$squid_listening_port表示squid监听的端口,默认为3128
$client_ip 表示访问用户的IP地址
$server_ip是squid主机的IP地址
下面的处理正确的处理了squid的输出
jesred的parse_buff函数
- int
- parse_buff(char *buff, char **url, char **src_addr, char **ident,
- char **method, ip_acl *ip, pattern_item *p)
- {
- int c, i;
- struct in_addr address;
- //char *token, *new_token;
- char *token, *new_token , *wc_token; //xtong add a new wc_token;
- char *end[4];
- c = 0;
- token = strchr(buff,' '); //token指向buff中第一个空格的位置,就是url的结束处
- if ( token ) { /* URL */ //判断token是否为null,后面的判断会输出incorrect input
- c++;
- *token = '\0'; // \0代表字符串的结束
- end[0] = token; //end数组是buff中空格的位置
- *url = buff; //将截取过的buff传递给url,也就是squid stdin的值
- new_token = strchr(++token,' '); //寻找下一个空格的位置
- if (new_token) { /* Address */
- c++;
- *new_token = '\0';
- end[1] = new_token;
- *src_addr = token;
- token = strchr(++new_token,' ');
- if (token) { /* Ident */
- c++;
- *token = '\0';
- end[2] = token;
- *ident = new_token;
- wc_token = ++token; //xtong add this
- //new_token = strchr(++token,'\n');
- new_token = strchr(wc_token,' ') ? strchr(wc_token,' ') : strchr(wc_token,'\n'); //xtong add this
- if (new_token) {
- c++;
- *new_token = '\0';
- end[3] = new_token;
- *method = token;
- }
- }
- }
- }
- if(c != 4) {
- for(i = 0; i < c; i++) {
- if ( end[i] )
- *end[i] = ' ';
- }
- log(ERROR, "incorrect input (%d): %s", c, buff);
- return 1;
- }
- #ifdef DEBUG
- log(DEBG, "Request: %s %s %s %s\n", *url, *src_addr, *ident, *method);
- #endif
- /* all methods must be GET or ICP_QUERY */
- c = 0;
- if (allow_siblings && (! strcmp(*method, "ICP_QUERY")) )
- c--;
- if( strcmp(*method, "GET") )
- c++;
- if ( c ) {
- #ifdef DEBUG
- for(c = 0; c < 4; c++) {
- if ( end[c] )
- *end[c] = ' ';
- }
- log(DEBG, "method not \"GET\" %s\n", buff);
- #endif
- return 1;
- }
其中红色部分为新加上去的代码,就可以简单的解决问题。
转载于:https://blog.51cto.com/shunter/1076482