apache rewrite 与linux软链的一个小问题

一个项目是apache+resin的架构,有一条 rewrite 规则是这样的:

RewriteRule ^/flashinfo/vinfo/([a-z0-9A-Z_]+).xml$ /video/videolist.htm?sid=$1 [PT,L]

其中,\.htm 交给resin处理

<LocationMatch (.*)\.htm>
SetHandler caucho-request
</LocationMatch>

理论上,访问 /flashinfo/vinfo/V5OJEFN7C.xml 文件,是会代理访问到 /video/videolist.htm?sid=V5OJEFN7C 的。

但事实上,却403了,如下:

$curl -I -H host:so.v.test.com http://127.0.0.1/flashinfo/vinfo/V5OJEFN7C.xml
HTTP/1.1 403 Forbidden
Date: Tue, 09 Feb 2010 07:29:30 GMT
Server: Apache/2.2.11 (Unix) Resin/3.0.26
Content-Type: text/html; charset=iso-8859-1

让我看看rewrite后的访问是否正常:

$curl -I -H host:so.v.test.com http://127.0.0.1/video/videolist.htm?sid=V5OJEFN7C
HTTP/1.1 200 OK
Date: Tue, 09 Feb 2010 07:33:23 GMT
Server: Apache/2.2.11 (Unix) Resin/3.0.26
Cache-Control: max-age=600
Expires: Tue, 09 Feb 2010 07:43:23 GMT
Content-Type: text/html

究竟什么原因呢??我看了一下,应该是这样的:

原因在于,在DocumentRoot下,有一个错误的软链video.

$ls -alh| grep video
lrwxrwxrwx  1 root root   29 02-09 15:29 video -&gt; /data/videopage

而/data/videopage这个目录是不存在的,所以video是一个错误的软链,rewrite 后的地址是 /video/videolist.htm?sid=$1 ,这样就爆403了。

真奇怪,其实apache 根本不用管我有没有video 这个目录的,因为都是转发到resin 去处理的了。既然想不通,就先记下。。。

我还做了两个测试:

1,让 video 成为一个正确的软链,curl 测试结果,200 。

2,把 video 删去,不存在这个软链,curl 测试结果,200。

————————————

结论:apache rewrite 后的地址,如 /data/dopost.jsp?sid=$1 这种,如果data 是一个错误的软链,尽管动态程序/data/dopost.jsp?sid=$1是正确的,apache 的 rewrite 都会不成功,返回 403 。如果 data 是一个正确的软链或者压根不存在,apache 正确地rewrite 。

Submit a Comment