使用 Apache Proxy 屏蔽横幅广告

作者:Raj Mathur

无论你拥有多少带宽,互联网带宽似乎永远都不够用。在家中,我使用老式的模拟交换机拨号上网,很少能获得优于 4800 bps 的连接;在办公室,我有一条(共享的)64KB 专线连接到我们在美国的办公室,然后再连接到互联网。然而,无论我在哪里上网(这是我工作的一部分),我一直希望有一种方法可以避免在从远程服务器加载横幅广告图片时等待页面显示。

我正在家里一台 66MHz 486 PC 上运行一个旧的、完全修改过的 Red Hat 版本(确切地说是 2.0),内核版本为 2.2.10。我使用这个系统进行浏览(主要使用 Lynx)、软件开发和 Linux 方面的实验。我的妻子和两个孩子也使用它,主要是使用 Netscape Communicator 通过基于 Web 的电子邮件服务进行浏览和收发电子邮件。

自从几年前我在这台系统上首次安装 Linux 以来,我一直在运行 Apache Web 服务器来提供本地内容。最近,我还启用了 Apache 的缓存代理模块,以维护常用文档的本地缓存,从而在一定程度上加快了互联网访问速度。我运行的 Apache 版本是 1.3.3(是的,我应该升级到最新版本,但目前没有迫切的需要)。

Apache Web 服务器 (https://apache.ac.cn/) 是一个著名的 HTTP 服务器,并且是大多数(如果不是全部)Linux 发行版的一部分。除了是世界上最受欢迎的 Web 服务器,在超过 56% 的网站上运行(Netcraft 调查,网址为 http://www.netcraft.com/)之外,Apache 还具有一些功能,可以帮助我将来自著名横幅广告网站的图片替换为无害的本地图片。

由于我运行的发行版太旧了,我将描述在更现代的发行版(即 Red Hat 6.0)上复制此方法的步骤。大多数其他流行的 Linux 发行版将需要相同或类似的步骤。

背景

为了将 Apache 用于此目的,我必须将其设置为 HTTP 代理,使用 mod_proxy,并启用和使用 Apache 内置的 URL 重写引擎 (mod_rewrite)。

简而言之,您必须首先设置 Apache 作为本地网络上浏览器(或单个系统,就像我在家中所做的那样)的代理服务器,并告知客户端浏览器使用该 Apache 主机作为代理。然后使用强大的 mod_rewrite URL 重写引擎来搜索横幅广告 HTTP 请求(这些请求与著名的横幅广告服务器主机的 URL 匹配),并将它们替换为本地图片。完成此操作后,您可以坐下来观看网页流入您的浏览器,同时那些恼人的广告会自动替换为更舒缓且更相关的图片。

在执行此处讨论的步骤时,您需要以 root 用户身份登录。

启用代理

第一步是加载和启用代理模块 (mod_proxy),它是 Apache 的一部分。在大多数发行版中,您可以通过将以下行附加到您的 Apache 服务器配置文件 (/etc/httpd/conf/httpd.conf 或 /usr/local/apache/etc/httpd.conf) 来启用 mod_proxy

ProxyRequests on

要检查模块是否已成功加载,请使用以下命令重启 Web 服务器

killall -1 httpd
检查 Apache 错误日志的最后几行(通常位于相对于 httpd.conf 文件的 ../logs/error_log../var/log/error_log 中),如果没有错误,那就庆祝吧!Apache 的代理功能已启用。这已在 Red Hat Linux 6.0 和 Debian “Potato” GNU/Linux 2.2 上测试过,并且应该适用于 SuSE Linux 6.1。

如果您收到类似如下的错误消息

Invalid command 'ProxyRequests', perhaps misspelled or defined
by a module not included in the server configuration

那么您需要找到 Apache Proxy 模块,或者下载并安装一个包含 mod_proxy 的 Apache 版本。安装不在本文的讨论范围之内。请参阅 Apache HOWTO,网址为 www.apache.org/docs-1.2/mod/mod_proxy.html

一旦您配置并运行了 Apache 代理,您就可以告知您的客户端浏览器使用它。在 Netscape Communicator 中,选择“编辑/首选项/高级/代理”,然后选择“手动代理配置”。单击“查看”按钮,并在“FTP 代理:”和“HTTP 代理:”的文本输入框中输入运行 Apache 的主机的名称,端口号都使用 80。

对于 Lynx,编辑默认位于 /etc/lynx.cfg 或 /usr/local/lib/lynx.cfg 中的全局 Lynx 配置文件,并更改以下行

#http_proxy:http://some.server.dom:port/
#http://some.server.dom:port/
#ftp_proxy:http://some.server.dom:port/

使其看起来像这样

http_proxy:http://apache.my.dom:80/
http://apache.my.dom:80/
ftp_proxy:http://apache.my.dom:80/
然后,将 apache.my.dom 替换为运行 Apache 服务器的主机的名称。类似的技术将适用于其他 Web 浏览器——请查阅浏览器的手册以获取详细信息。
配置重写引擎

现在您已经配置了 Apache Proxy 并设置了浏览器以使用它,您可以开始处理问题的核心,即将横幅广告重定向到本地图片,从而节省带宽、时间和金钱。

在您实际决定要重定向哪些 URL 之前,您需要为 mod_rewrite 进行基本设置。将以下行添加到 Apache 的配置文件 httpd.conf 中

RewriteEngine on
RewriteLog logs/rewrite_log
RewriteLogLevel 1

您可能需要稍微调整 RewriteLog 指令中的文件名,以符合您的发行版的文件系统约定。例如,在默认的 Apache 构建中,适当的指令将是

RewriteLog var/log/rewrite_log
此外,您可以将 RewriteLogLevel 从 1 增加到最大值 9,以获得有关重写引擎正在执行的操作的更详细信息,这有助于调试。但是,一旦您对它的工作方式感到满意,最好将 RewriteLogLevel 降低到 0。这将停止所有日志记录并减少 Apache 服务器的负载。

完成此操作后,您现在可以准备好重定向横幅广告了。假设您要重定向所有源自 URL http://任何内容.unclick.net/adi_任何内容、http://任何主机.unclick.net/jump_任何内容 和 http://image_任何内容.click2com.net/任何内容 的图片。我选择显示“Powered by Apache”徽标(Apache 附带的,位于文件 icons/apache_pb.gif 中)来代替广告。将清单 1 中显示的行添加到您的 httpd.conf 文件中,以显示 Apache GIF 而不是来自这些来源的图片,当然,您需要将 apache.your.dom 替换为您设置的 Apache 服务器的名称。

清单 1

如您所见,每个重定向都包含两个部分:RewriteCond 和 RewriteRule。RewriteCond 标识了我们要从中重定向的主机 (%{HTTP_HOST})。指令中的第三个字符串是主机名,以正则表达式的形式给出。在正则表达式中,句点 (.) 代表任何字符,因此我们使用 "." 来表示域名中的文字句点。".*" 代表任何任意字符串,脱字符号 (^) 强制匹配主机名的开头。因此,例如,正则表达式 ^image.*\.click2com\.net 匹配主机 image.click2com.net、images.click2com.net 和 images05.adverts.click2com.net,但不匹配 ads.image.click2com.net。

一旦我们使用 RewriteCond 找到主机,我们就使用以下 RewriteRule 指令来查看 URL 的任何部分是否与规则中的第一个字符串(正则表达式)匹配;如果匹配,我们将重定向到相应的(本地)图片。例如,在第一个 RewriteCond 中找到 unclick.net 域中的主机后,我们然后在随后的 RewriteRule 中检查字符串 /ad任何内容 是否出现在 URL 的任何位置。如果出现,我们将重定向 Apache 代理以发送来自代理主机的图像 /icons/apache_pb.gif。当然,您可以使用任何您喜欢的图像,并且它不一定需要在代理服务器主机上——任何 URL 都可以。最后的 [R] 将 HTTP 请求转换为 HTTP 重定向 (302)。如果您不了解 HTTP,请不要担心;我也不了解,但这是必需的。

您可以添加任意数量的重写条件和规则来重定向横幅广告网站。我仍在寻找著名的广告 URL 的完整列表——如果您可以添加一些,请告诉我。

注释

我描述的设置 Apache 代理的方法纯粹是为了重定向横幅广告。Proxy 模块还有许多其他功能,这里没有介绍。其中最有用的一项可能是它能够在本地磁盘上缓存经常访问的文档,并进一步减少浏览 Web 所需的带宽和时间。尝试使用 httpd.conf 中的缓存指令,并判断其对您的浏览速度的影响。

此外,我在这里描述的配置重写引擎的方法只是一种方法。这种方法可能不是最优的,因为它是一天摆弄 mod_rewrite 的结果,但它有效并且满足我的目的。

mod_rewrite 是一个极其强大且通用的重写引擎,我们在这个小型重定向应用程序中只看到了其功能的一个应用。有关 Apache、其通用模块以及特别是 mod_rewrite 的更多信息,请参阅“资源”。

您可能会发现有用的另一个技巧是将两个辅助 Apache 配置文件 access.conf 和 srm.conf 合并到主配置文件 httpd.conf 中。这可以显著加快 Apache 的速度,尤其是在负载较重的服务器上。为了做到这一点,将 access.conf 和 srm.conf 的内容复制到 httpd.conf 中,最好放在末尾的某个位置,尽管位置实际上并不重要。现在在 httpd.conf 的开头附近添加以下两行

AccessConfig    /dev/null
ResourceConfig  /dev/null

同样,位置不是很重要,只要您不要将这些行插入到多行指令的中间即可。

在 Apache 站点上可以找到对这种方法的相当异想天开的描述,列在“资源”中(请参阅“为什么有三个配置文件?”)。

结论

我已经使用 Apache 重定向互联网广告一段时间了,并且对结果非常满意。在我家里的慢速连接上浏览网页,等待时间大大减少,体验更加愉快。

当我第一次开始使用 Apache 时,我从未期望能够主动地将其用于此特定目的。mod_rewrite 的作者 Ralf Engelschall 也没有想到他的杰作会被用于此目的。它可以做到这一点的这一事实再次强调了 UNIX、Linux 和 Apache 背后的哲学之美——如果你使各个部分足够通用,并提供组合它们的功能,那么它们的总和总是大于整体。

资源

电子邮件: raju@sgi.com

Raju Mathur (raju@sgi.com) 名义上为印度 SGI 工作,但设法将大量时间花在他的初恋 Linux 上。他从内核 0.99.11 时代就开始使用 Linux,目前是印度 Linux 用户组德里分会的协调员。他与一位前世疗法师 Aparna 结婚,并且是 Shiv 和 Ella 两个孩子的骄傲父亲。

加载 Disqus 评论