设为首页 收藏本站
查看: 1112|回复: 0

[经验分享] 怎样让squid follow 302的响应

[复制链接]

尚未签到

发表于 2015-11-19 11:55:28 | 显示全部楼层 |阅读模式
  http://blog.iyunv.com/uid-8474831-id-3463461.html
  
大家都知道,http的302响应,是一种跳转。比如用户访问url:
http://www.sina.com/ 时,


  点击(此处)折叠或打开

  • GET / HTTP/1.1
  • User-Agent: curl/7.15.5 (x86_64-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
  • Host: www.sina.com
  • Accept: */*

sina的服务器会返回一个301的响应(302也类似),让你的浏览器去访问 http://www.sina.com.cn/


  点击(此处)折叠或打开

  • HTTP/1.0 301 Moved Permanently
  • Date: Sun, 06 Jan 2013 10:16:17 GMT
  • Server: Apache
  • Location: http://www.sina.com.cn/
  • Cache-Control: max-age=3600
  • Expires: Sun, 06 Jan 2013 11:16:17 GMT
  • Vary: Accept-Encoding
  • Content-Length: 231
  • Content-Type: text/html; charset=iso-8859-1
  • Age: 3015
  • X-Cache: HIT from sh201-12.sina.com.cn
  • Connection: close



squid在处理301或302的响应时,只能把这个30x响应给到客户端,然后由客户端发起对http://www.sina.com.cn/ 的请求。
那么,能不能让squid在客户端请求http://www.sina.com/ 的时候,直接返回http://www.sina.com.cn/ 的200内容呢?
其实非常简单,只要几十行代码就搞定!
接下来我就手把手教给你怎么做

首先,在client_side.c里面,加上这个函数clientProcess302Header


  点击(此处)折叠或打开

  • //add by xiaosi start

  • static void clientProcess302Header(void *data, HttpReply * rep)

  • {

  •         clientHttpRequest *http = data;

  •         HttpHeaderEntry *location_entry = httpHeaderFindEntry(&rep->header, HDR_LOCATION);

  •         if(!location_entry)

  •         {

  •                 http->orig_header_callback(data, rep);

  •                 return;

  •         }



  •         char *location = xstrdup(strBuf(location_entry->value));

  •         http->location = location;

  •         http->out.offset = 0;

  •         http->out.size = 0;

  •         StoreEntry *e;

  •         if ((e = http->entry))

  •         {

  •                 http->entry = NULL;

  •                 storeClientUnregister (http->sc, e, http);

  •                 http->sc = NULL;

  •                 storeUnlockObject (e);

  •         }

  •         /* old_entry might still be set if we didn'tyet get the reply

  •          * code in clientHandleIMSReply() */

  •         if ((e = http->old_entry))

  •         {

  •                 http->old_entry = NULL;

  •                 storeClientUnregister (http->old_sc, e, http);

  •                 http->old_sc = NULL;

  •                 storeUnlockObject (e);

  •         }

  •         clientRedirectStart(http);

  • }

  • //add by xiaosi end



然后修改storeClientCopyHeaders,改成下面的样子。注意add by xiaosi注释里面的代码


  点击(此处)折叠或打开

  • void

  • storeClientCopyHeaders(store_client * sc, StoreEntry * e, STHCB * callback, void *callback_data)

  • {

  •     clientHttpRequest *http = callback_data;

  • //add by xiaosi start

  • // http->header_callback = callback;

  •     http->header_callback = clientProcess302Header;

  •     http->orig_header_callback = callback;

  • //add by xiaosi end

  •     http->header_entry = e;

  •     storeClientCopy(http->sc, e, 0, 0, STORE_CLIENT_BUF_SZ, memAllocate(MEM_STORE_CLIENT_BUF), storeClientCopyHeadersCB, http);

  • }



然后修改client_side_rewrite.c里面的clientRedirectStart,注意add by xiaosi注释里面的代码


  点击(此处)折叠或打开

  • void

  • clientRedirectStart(clientHttpRequest * http)

  • {

  •     debug(33, 5) ("clientRedirectStart: '%s'\n", http->uri);

  •     //add by xiaosi start

  •     if(http->location)

  •     {

  •             http->redirect_state = REDIRECT_PENDING;

  •             char *location = xstrdup(http->location);

  •             safe_free(http->location);

  •             clientRedirectDone (http, location);

  •             safe_free(location);

  •             return;

  •     }

  •     //add by xiaosi end

  •     if (Config.Program.url_rewrite.command == NULL) {

  •         clientRedirectDone(http, NULL);

  •         return;

  •     }

  •     if (Config.accessList.url_rewrite) {

  •         http->acl_checklist = clientAclChecklistCreate(Config.accessList.url_rewrite, http);

  •         aclNBCheck(http->acl_checklist, clientRedirectAccessCheckDone, http);

  •     } else {

  •         redirectStart(http, clientRedirectDone, http);

  •     }

  • }

注意,我们在clientHttpRequest中加入了2个成员,location和orig_header_callback。在structs.h的struct _clientHttpRequest 结构的末尾加上他们。注意add by xiaosi注释里面的代码




  点击(此处)折叠或打开

  • struct _clientHttpRequest {

  • // bla bla bla…

  • // bla bla bla…

  • // bla bla bla…



  •     dlink_node active;

  •     squid_off_t maxBodySize;

  •     STHCB *header_callback; /* Temporarily here for storeClientCopyHeaders */

  •     StoreEntry *header_entry; /* Temporarily here for storeClientCopyHeaders */

  •     int is_modified;

  •     //add by xiaosi start

  •     char *location;

  •     STHCB *orig_header_callback; /* Temporarily here for storeClientCopyHeaders */

  • //add by xiaosi end

  • };

基本上就完工了。重新编译安装,重启squid。再通过squid请求一下http://www.sina.com/ 是不是看到200了呢?

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-141136-1-1.html 上篇帖子: squid缓存:refresh_pattern指令 下篇帖子: 清除Squid缓存的小工具
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表