apache这里有一些奇怪的日志。
211.90.119.118 - - [12/Apr/2006:00:00:12 +0800] "GET http://abc.com.cn/www/x.jsp HTTP/1.1" 200 2994 "-" "SEC-schx639 UP.Browser/4.1.26l"
通常GET这里都是“/www/x.jsp”的,可是这个是怎么产生的呢?通过浏览器访问http://abc.com.cn/http://abc.com.cn/www/x.jsp,也不能产生这种请求,后来查看apache手册,这个引号里面表示的是“请求的第一条信息”,google了一下才知道,可以用下面的方式产生这种日志。
telnet abc.com.cn 80
GET http://abc.com.cn/www/x.jsp HTTP/1.1

这样看来,这个请求应该是不正确的,“get /www/x.jsp HTTP/1.1”才对。这个请求被转发给weblogic之后,weblogic会处理不了,因为他会去找“http://abc.com.cn/http://abc.com.cn/www/x.jsp”这个文件,显然是找不到的。
不过幸好,weblogic有个PathTrim设置,将请求路径种的“http://abc.com.cn”给他去掉就可以了。
<IfModule mod_weblogic.c>
WebLogicHost 192.168.0.252
WebLogicPort 7050
PathTrim http://abc.com.cn
MatchExpression *.jsp
</IfModule>
问题似乎解决了。不过此后又发现我们的域名不止这一个,还有def.com.cn和dfg.com.cn,解决方法似乎也很简单,多添加几个PathTrim呗,但是此后你就会发现,weblogic似乎比较弱智,只有最后一个PathTrim设置会生效……,查看了weblogic的文档也没有找到解决方法,他那里也没有说可以写几个。
这样就需要从apache这里解决,幸好apache这里还有虚拟主机。针对各个域名分别配置几个虚拟主机,建立基于域名的虚拟主机。文档可以参考这里  。
需要注意的是,基于域名的虚拟主机配置好之后,如果用虚拟主机里面没有的域名访问的时候,他会去匹配第一个虚拟主机,同样,用ip访问也会如此。
当一个请求到达的时候,服务器会首先检查它是否使用了一个能和 NameVirtualHost相匹配的IP地址。如果能够匹配, 它就会查找每个与这个IP地址相对应的<VirtualHost>配置段, 并尝试找出一个ServerName或ServerAlias配置项与请求的主机名相同的。 如果找到了,它就会使用这个服务器的配置。 否则,将使用符合这个IP地址的第一个列出的虚拟主机。
配置好虚拟主机之后,上面的问题就解决了。接着就发现有些终端不能正常访问业务了。查看全局的配置,有些rewrite rule的配置,想当然认为虚拟主机会继承全局设置。其实不是这样的,全局的对虚拟主机的没有任何影响。还需要在虚拟主机中单独设置。
RewriteEngine on

RewriteLog /usr/local/apache/apache_rewrite_log.log
RewriteLogLevel 2

RewriteRule  xx
建议加上log的设置,这样可以很好的检查rewrite有没有起作用。此外,也一定要加上RewriteEngine on,否则任何rewrite rule都不会起作用。