2010-05-14 87 views
5

我試圖讓我的周圍的RewriteCond頭,要重寫無論是靜態的html頁面的任何請求(如果存在的話),或特定的index.php(模擬2級只要請求的文件不存在)。的if-else使用的RewriteCond

爲了說明邏輯:

if HTTP_HOST is '(www\.)?mydomain.com' 
    if file exists: "/default/static/{REQUEST_URI}.html", then 
     rewrite .* to /default/static/{REQUEST_URI}.html 
    else if file exists: {REQUEST_FILENAME}, then 
     do not rewrite 
    else 
     rewrite .* to /default/index.php 

我似乎沒有什麼太大的麻煩做這件事的時候我並不需要測試的HTTP_HOST。最終,這個.htaccess文件將處理多個域的請求。

我知道我可以解決這個問題有虛擬主機,但我想弄清楚如何做這種方式。

我不是太熟悉的一些其他標誌的,將其中的任何是利用這裏(如鏈| C,接下來| N或跳過| S)?

在此先感謝!


更新:我已經成功地做到這一點,但希望選擇:

RewriteCond %{HTTP_HOST} ^(domainA|domainB)\..* [NC] 
RewriteCond %{DOCUMENT_ROOT}/%1/static/%{REQUEST_URI}.html -f 
RewriteRule (.*)? /%1/static/$1.html [NC,L] 

RewriteCond %{HTTP_HOST} ^(domainA|domainB)\..* [NC] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule .* /%1/index.php [L,QSA] 

更新#2:從甘博的回答幫助,想出了另一個。我喜歡這將需要更少的維護在添加域的情況下。 (感謝濃湯!)

是否有爲什麼我不應該設置ENV變量的任何原因?

RewriteCond %{HTTP_HOST} ^(domainA|domainB)\..*$ [NC] 
RewriteRule^- [E=APP:%1] 

RewriteCond %{DOCUMENT_ROOT}/%{ENV:APP}/static/%{REQUEST_URI}.html -f  
RewriteRule (.*)? /%{ENV:APP}/static/$1.html [NC,L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule .* /%{ENV:APP}/index.php [L,QSA] 

回答

4

我可能會做這樣的:

RewriteCond %{HTTP_HOST} !^(www\.)?example\.com$ 
RewriteRule^- [S=2] 

RewriteCond %{DOCUMENT_ROOT}/default/static%{REQUEST_URI}.html -f 
RewriteRule !^default/static/ default/static%{REQUEST_URI}.html [L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule !^default/static/ default/index.php [L] 

這類似於更新的例子。除非主機不合適,否則第一條規則將跳過以下兩條規則。 RewriteRule模式排除以/default/static/開頭的任何路徑。但是你的規則已經很不錯了。

+0

謝謝!當我意識到這一點時,我不知道不重寫規則的語法。 這給了我另一種解決方案是原來是正是我想要的想法(更新原來的職位)。再次感謝! – 2010-05-14 20:38:23