Dec 052006
 

事情起因是因为公司服务器没有采用vhost方式,而是直接把一个整个站点监听在IP:80上,假定IP为1.2.3.4,公司网站域名为abc.com。
这样我们不论是输入http://abc.com还是http://1.2.3.4都可以正常访问公司网站。
而不知哪个搞笑的家伙竟然把另外一个毫不相干的域名def.com也解析到了1.2.3.4。这样通过http://def.com访问也是访问到了我们公司的网站。
更搞笑的是,这个def.com的域名以前跑的是一个做与我们类似业务的公司的网站,于是这家公司的倒霉客户找到我们这里来,问这到底是为什么,是否def.com被我们公司收购了云云。

于是一边诅咒那个缺德的域名管理员,一方面想办法要让http://def.com访问不到我们的站点,首先我们不可能控制这个def.com的解析,那就只能在我们自己服务器上作手脚了,我想到的是利用Apache的mod_rewrite来实现。

准备工作不详细写了,不过是Load相应模块,设置AllowOveride All等。而详细实现也只有简单的几句代码,在站点根目录建立.htaccess文件,写入如下内容:

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} !www.abc.com [NC]
RewriteCond %{HTTP_HOST} !abc.com [NC]
RewriteCond %{HTTP_HOST} !1.2.3.4 [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^.* – [F,L]

这样实现的结果是只能通过www.abc.com,abc.com,1.2.3.4来访问站点,用其他的HOST访问都会显示403Forbidden。

备忘:{HTTP_HOST}代表HTTP协议GET动作同时传递的Host的值,[NC]代表忽略大小写;[F]代表动作为禁止;[L]代表最终匹配。
该练习一下正则表达的功底了,越来越多的地方要用到了。

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>