Squid URL跳转
运维    2017-01-06 00:00:29    45    0    0
admin   运维

需求

    当Iphone/Ipad/Android 等访问 http://www.xxx.com 时跳转到 http://www.xxx.com/mobile/xxx/mobile.html?ref=www.xxi.com/


分析

    squid不自带 url重写/跳转 功能, 要实现这些功能需要借助重定向器来解决通过redirect_program指令 指定一个重定向器 来处理url的重写/跳转redirect_program 可以用perl/php/python 甚至shell来编写

 

思路

    使用squid的redirect_program 指令 ,指定一个重定向器处理url跳转, 使用acl 匹配Iphone, Ipad, Android 平台


过程

tip

    根据[squid权威手册]得知,重定向器从标准输出接收squid数据, 每一行包括以下4个元素:

1. 请求url

2. 客户IP地址和完全可验证域名

3. 用户名,通过RFC 1413 ident或代理验证

4. HTTP请求方式

exp: http://www.example.com/page1.html 192.168.2.3/- - GET

 

了解这个是非常重要的,本人就是因为一开始不知道这个,导致我的重定向器无法使用

    

    然后, 重定向程序永不退出,除非在标准输入里发生end-of-file 这个也是很重要的,不然会导致重定向器的进程占用大量的cpu.最后, 重定向器返回空行, squid将不会对url做任何处理,该怎样还是怎样

 

产生一个重定向消息

    网络上很多是基于perl的. 由于我不擅长那家伙, 于是我就用python写了一个例子.


#!/usr/bin/python
import sys
import re
URL_PATTERN = re.compile('(?P<scheme>https?://)(?P<host>[^/]*)(?P<request>.*)')
GUIDE = re.compile("^/mobile/xxx/mobile\.html")
def redirect(line):
    old_url = line.split()[0] 
    m = URL_PATTERN.match(old_url)
    if not m: return '\n'
    scheme = m.group('scheme')
    hostname = m.group('host')
    request = m.group('request')
    if GUIDE.match(request): return '\n'
    new_url = "302:http://www.xxx.com/mobile/xxx/mobile.html?ref=%s\n"%( old_url)
    return new_url
while True:
    line = sys.stdin.readline().strip()
    if not line: break
    try:
        url = redirect(line)
        sys.stdout.write(url)
        sys.stdout.flush()
    except Exception, e:
        pass​


将此脚本给予 执行权限chmod +x mobile_redirect.py

 

然后在squid.conf中增加


acl Debian browser Chrome 
acl Iphone browser -i (iPhone|iPad)
acl Android browser -i Android
redirect_program /squidpath/mobile_redirect.py
redirect_children 6
redirector_access allow Debian
redirector_access allow Iphone
redirector_access allow Android​


重启squid之后, 观察结果

客户端请求 www.xxx.com

squid 日志中


1381544425.298 0 14.23.156.2 TCP_MISS/302 522 GET http://www.xx.com/mobile/xxx/mobile.html?ref=http://www.xxx.com/ - NONE/- -​


客户端返回


HTTP/1.0 302 Moved Temporarily
Server: squid
Date: Sat, 12 Oct 2013 02:19:37 GMT
Content-Length: 0
Location: http://www.xx.com/mobile/xxx/mobile.html?ref=http://www.xxx.com/
X-Cache: MISS from 0.cnc.cache.xx.com
X-Cache-Lookup: HIT from 0.cnc.cache.xx.com:80
Via: 1.1 0.cnc.cache.xx.com:80 (squid)
Connection: close​


squid 成功跳转

 

总结

    在本人处理这个需求的时候, 不了解squid跳转的过程和注意点,因此走了很多弯路.浪费很多时间, 处理完毕之后,突然发现 其实squid跳转非常简单. 只要了解以上tip就好了

 

[参考文档](http://home.arcor.de/pangj/squid/chap11.html#a1)

Pre: No Post

Next: bnx2驱动缺陷导致网卡down掉

45
Sign in to leave a comment.
No Leanote account? Sign up now.
0 comments
Table of content