mod_rewrite如果文件存在

时间:2010-05-05 03:36:09

标签: .htaccess mod-rewrite url-rewriting

我已经有两个重写规则现在可以正常工作,但是必须添加更多代码才能完美运行。

我有一个在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页面,除非没有。

我希望它描述得足够好。谢谢你的时间!

2 个答案:

答案 0 :(得分: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 :(得分: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]