今天下午,我们网站(www.eu169.com)提供的手机软件不能连接网络了,所有的被访问文件都找不到,而到这个目录下发现文件都在。如果采用.php直接访问就是正确的,rewrite 规则也是正确的;如果换了目录的名字访问也是正确的。但是换回自己的名字访问就不正确了,还是404.就在我要崩溃的时候,发现了下面这篇帖子:
原来另一个同学不小心在根目录下建立了一个和手机软件的中间件所在目录一样名字的目录。删除这个目录,问题解决。但是代价是浪费2个小时外加损失3000的手机pv,教训深刻啊。记录下来,以免大家再犯同样的错误。
原文链接:http://www.zeali.net/entry/405
现象:在 VirtualHost 配置块中启用 RewriteEngine ,进行 url rewrite ,结果发现重写到某一个目录下的url总是报错,说是 url 不存在。但通过实际的动态url去访问一切正常。
httpd-vhost.cnf相关配置如下:
ServerAdmin noname@gmail.com
DocumentRoot /www/html/scripts
ServerName scripts.zeali.net
ErrorLog /logs/scripts.zeali.net-error_log
CustomLog /logs/scripts.zeali.net-access_log common
RewriteEngine On
RewriteRule /entry/([0-9]+)\.html /live/entry.php?id=$1
反复测试,发现如果把 /www/html/scripts 下的 live 目录重命名成其他的名字, url rewrite 就完全正常。难道说 live 是 mod_rewrite 的关键字?不太可能。继续检查,发现在操作系统的根目录下存在一个同名的 live 目录。把这个目录删除之后, rewrite 恢复正常。
结论: mod_rewrite 在执行 RewriteRule 的时候首先寻找的是操作系统的目录层次,而不是 DocumentRoot 下的相对目录层次;因此如果不幸在 DocumentRoot 目录下存在与操作系统根目录下一样的目录, mod_rewrite 将不会正确的找到 rewrite 的目标 url 。Updated 2006-07-18 14:40 — 如果使用 .htaccess 文件设置 RewriteRule 的话,因为使用的是相对目录形式,就不会存在这个问题。
目前暂时找不到明确的文档来印证这个问题,或者说我对 mod_rewrite 的理解太浅。希望能看到更准确的说法来诠释这个现象。在此之前,只能认为这是 mod_rewrite 设计上的问题,注意不要让需要加入 RewriteRule 的文档地址与操作系统的目录结构发生冲突。
最新评论