🔗 功能:存储 URL 重写
- 目标:将用于存储查找的 URL 与用于转发的 URL 分开。这允许多个目标 URL 引用相同的后端内容,并减少重复内容,无论是对于前向代理(例如“Google 地图”)还是 CDN 类型反向代理。
- 状态:已弃用。请参阅 StoreID
- 版本:仅限 2.7
- 开发者:AdrianChadd。
- 更多:关于 Google 地图内容背景信息 - http://squidproxy.wordpress.com/2007/11/16/how-cachable-is-google-part-1-google-maps/ (免责声明:不,我不在 Google 工作。不,我从未在那里工作过。)
- 赞助商:Xenion Communications
🔗 详细信息
此功能的主要重点是支持缓存各种 CDN 提供的、将相同资源/内容映射到多个位置的内容。最初,我将目标定为 Google 内容 - Google Earth、Google 地图、Google 视频、Youtube - 但相同的技术也可用于缓存 Akamai 等 CDN 的类似内容(例如“Microsoft Updates”。)
Squid-2.HEAD 的当前更改通过一系列结构性更改实现了此功能
- client_side.c 中的“Rewrite”代码被分解到 client_side_rewrite.c 中;
- 这被用作 client_side_storeurl_rewrite.c 中“存储 URL”重写的模板;
- 一个外部辅助程序(使用与重定向辅助程序完全相同的数据格式!)接收 URL 并将其重写为规范形式 - 这些重写的 URL 被存储为“store_url”URL,与普通 URL 分开;
- 现有的/普通 URL 用于 ACL 和转发
- “store_url”URL 用于存储键查找和存储
- 添加了一个新的元类型 - STORE_META_STOREURL - 这意味着磁盘对象格式已略有更改。这没什么大不了的 - 如果在尝试此功能后回滚到另一个 squid 版本,Squid 可能会警告未知元数据类型,但这不会影响您缓存的操作。
🔗 Squid 配置
首先,您需要确定要发送到存储 URL 重写器的 URL。
acl store_rewrite_list dstdomain mt.google.com mt0.google.com mt1.google.com mt2.google.com
acl store_rewrite_list dstdomain mt3.google.com
acl store_rewrite_list dstdomain kh.google.com kh0.google.com kh1.google.com kh2.google.com
acl store_rewrite_list dstdomain kh3.google.com
acl store_rewrite_list dstdomain kh.google.com.au kh0.google.com.au kh1.google.com.au
acl store_rewrite_list dstdomain kh2.google.com.au kh3.google.com.au
# This needs to be narrowed down quite a bit!
acl store_rewrite_list dstdomain .youtube.com
storeurl_access allow store_rewrite_list
storeurl_access deny all
然后,您需要配置一个重写器辅助程序。
storeurl_rewrite_program /Users/adrian/work/squid/run/local/store_url_rewrite
然后,要缓存 Google 地图/等内容,您需要更改默认设置,以便带有“?”的 URL 不会自动变得不可缓存。搜索您的配置并删除这两行
#We recommend you to use the following two lines.
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY
确保检查配置文件中的 cache 和 no_cache 指令;您需要禁用它们,并在适用的地方使用 refresh_patterns 来告诉 Squid 不要缓存什么!
然后,在您的 refresh_pattern 部分的底部添加这些刷新模式。
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
这些规则确保您不会尝试缓存 cgi-bin 和 ? URL,除非明确提供了过期信息。确保不要在“refresh_pattern .”行之后添加规则;refresh_pattern 条目按顺序评估,第一个匹配项将被使用!最后一个条目必须是“.”条目!
🔗 存储 URL 重写辅助程序
这是我一直在使用的
#!/usr/bin/perl
$| = 1;
while (<>) {
chomp;
# print STDERR $_ . "\n";
if (m/kh(.*?)\.google\.com(.*?)\/(.*?) /) {
print "http://keyhole-srv.google.com" . $2 . ".SQUIDINTERNAL/" . $3 . "\n";
# print STDERR "KEYHOLE\n";
} elsif (m/mt(.*?)\.google\.com(.*?)\/(.*?) /) {
print "http://map-srv.google.com" . $2 . ".SQUIDINTERNAL/" . $3 . "\n";
# print STDERR "MAPSRV\n";
} elsif (m/^http:\/\/([A-Za-z]*?)-(.*?)\.(.*)\.youtube\.com\/get_video\?video_id=(.*) /) {
# http://lax-v290.lax.youtube.com/get_video?video_id=jqx1ZmzX0k0
print "http://video-srv.youtube.com.SQUIDINTERNAL/get_video?video_id=" . $4 . "\n";
} else {
print $_ . "\n";
}
}
一个简单且非常快的重写器,名为 SQUIRM,也值得一看,它使用 regex 库进行模式匹配。
一个更快、功能稍多一点的重写器是 jesred。
🔗 我如何制作自己的?
辅助程序必须从标准输入读取 URL(每行一个),并在标准输出写入重写的 URL 或空行。Squid 会在 URL 之后写入附加信息,重定向器可以使用这些信息来做出决定。
从 Squid 接收的输入行
[channel-ID] URL [key-extras]
- channel-ID 如果启用了并发,这是行的 ID。当并发关闭(设置为1)时,此字段及后面的空格将完全缺失。
- URL 从客户端接收的 URL。在支持 ICAP 的 Squid 中,这是 ICAP REQMOD 发生后的 URL。
-
key-extras 从 Squid-3.5 开始,将附加参数传递给辅助程序,这些参数可以通过 url_rewrite_extras 进行配置。为了向后兼容,URL 辅助程序的默认 key-extras 与 Squid-3.4 及更早版本在此字段位置发送的格式字段匹配
ip/fqdn ident method [urlgroup] kv-pair - ip 这是客户端的 IP 地址。后面跟着一个斜杠 (/),如上所示。
- fqdn 客户端的 FQDN rDNS(如果已知)。Squid 通常不会执行查找,除非日志记录或 ACL 需要。Squid 不会等待任何结果,除非配置的 ACL 需要等待。如果没有可用,将向辅助程序发送-。
- ident 客户端计算机的 IDENT 协议用户名(如果已知)。Squid 不会等待 IDENT 用户名可知,除非有依赖它的 ACL。因此,在重写器运行时,IDENT 用户名可能还不知道。如果没有可用,将向辅助程序发送-。
- method HTTP 请求方法。URL 更改,特别是重定向,仅可能在某些方法上进行,而像 POST 和 CONNECT 这样的一些方法需要特别小心。
- urlgroup Squid-2 将发送此字段以及可以在 http_port 上配置的 URL 分组标签。Squid-3.x 不会发送此字段。
-
kv-pair 一个或多个 key=value 对。下面仅记录了“myip”和“myport”对,并且由 Squid-3.4 及更早版本无条件发送
| ---------- | ----------------------- | | myip=... | Squid receiving address | | myport=... | Squid receiving port |
返回给 Squid 的结果行
[channel-ID] [result] [kv-pair] [URL]
- channel-ID 如果收到并发channel-ID,则必须将其作为行上的第一个条目原样发送回 Squid。
-
result 结果代码之一
| --- | ------------------------------------------ | | OK | Success. A new URL is presented | | ERR | Success. No change for this URL. | | BH | Failure. The helper encountered a problem. |
结果字段仅被 Squid-3.4 及更新版本接受。
-
kv-pair 一个或多个 key=value 对。此接口上保留的用于 URL 重写的键名
| --- | --- | | clt_conn_tag=... | Tag the client TCP connection ([Squid-3.5](/Releases/Squid-3.5)) | | message=... | reserved | | rewrite-url=... | re-write the transaction to the given | | tag=... | reserved | | ttl=... | reserved | | \*_=... | Key names ending in (_) are reserved for local administrators use | -
URL 将代替客户端发送的 URL 使用的 URL。如果不需要执行任何操作,请将 URL 字段留空。发送的 URL 必须是绝对 URL。即以 *http://* 或 *ftp://* 等开头。
此辅助程序返回的 kv-pair 可以通过 %note logformat 代码进行日志记录。
类别:功能
导航:站点搜索,站点页面,类别,🔼 向上