2010-05-05 56 views
4

我已经有两个重写规则现在可以正常工作,但还需要添加更多的代码才能完美工作。mod_rewrite如果文件存在

我有一个网站在mydomain.com上托管,所有subdom.mydomain.com都重新编译为mydomain.com/subs/subdom。我的CMS有如果被达成的文件不存在处理请求,重写可以这样判定:

RewriteCond $1 !^subs/ 
RewriteCond %{HTTP_HOST} ^([^.]+)\.mydomain\.com$ 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ subs/%1/index.php?page=$1 [L] 

我CMS处理解析像往常一样的一个部分。问题是,如果一个文件确实存在,我需要链接到它不经过我的CMS,我设法做到这一点是这样的:

RewriteCond $1 !^subs/ 
RewriteCond %{HTTP_HOST} ^([^.]+)\.mydomain\.com$ 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.*)$ subs/%1/$1 [L] 

到目前为止,似乎像一个魅力的工作。现在我很挑剔,我需要有存储在subs/default /中的默认文件。如果文件存在于子域文件夹中,我们应该抓住这个文件夹,但如果没有,我们需要从默认子域中获取文件。如果文件不存在,我们应该使用当前子域的404页面,除非没有。

我希望它描述得很好。感谢您的时间!

回答

3

问题是您需要提供绝对文件系统路径才能获得-f-d的工作。如果您在文档根的时候,你可以使用此规则:

RewriteCond $1 !^subs/ 
RewriteCond %{DOCUMENT_ROOT}/subs/default/$1 -f [OR] 
RewriteCond %{DOCUMENT_ROOT}/subs/default/$1 -d 
RewriteRule ^(.*)$ subs/default/$1 [L] 

但如果你在其它地方,这将是很难得到正确的路径前缀。

1

感谢Gumbo我设法弄清楚如何解决它。这是我想出的:

#GET FILE FROM THE SUBDOMAIN DIRECTORY IF IT EXISTS 
RewriteCond $1 !^subs/ 
RewriteCond %{HTTP_HOST}%{REQUEST_URI} ^([^.]+)\.clan-websites\.com(.*)$ 
RewriteCond %{DOCUMENT_ROOT}/subs/%1/%2 -f [OR] 
RewriteCond %{DOCUMENT_ROOT}/subs/%1/%2 -d 
RewriteRule ^(.*)$ subs/%1%2 [L] 

#GET THE DEFAULT FILE IF NOT FOUND IN SUBDOMAIN 
RewriteCond $1 !^subs/ 
RewriteCond %{REQUEST_URI} ^(.*)$ 
RewriteCond %{DOCUMENT_ROOT}/subs/factory/%1 -f [OR] 
RewriteCond %{DOCUMENT_ROOT}/subs/factory/%1 -d 
RewriteRule ^(.*)$ subs/factory%1 [L] 

#SEND THE DATA TO THE SUBDOMAIN CMSMS SINCE NO FILE EXISTS 
RewriteCond $1 !^subs/ 
RewriteCond %{HTTP_HOST}%{REQUEST_URI} ^([^.]+)\.clan-websites\.com(.*)$ 
RewriteCond %{DOCUMENT_ROOT}/subs/%1/%2 !-f [OR] 
RewriteCond %{DOCUMENT_ROOT}/subs/%1/%2 !-d 
RewriteRule ^(.*)$ subs/%1/index.php?page=$1 [L]