2010-05-05 55 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]